2010-04-16 4 views
3

저는 Djangoer를 새로 작성하고 맞춤 위젯을 만드는 방법을 알아 냈습니다. 양식에서 MySelectWidget을 사용하여 MEDIA_URL 자체를 가져올 수 있지만 내 위젯 템플릿에서 MEDIA_URL을 가져올 수 없습니다. Django 위젯 템플릿에서 MEDIA_URL을 가져올 수 없습니다.

# 
#plus_sign.html 
# 
<a href="" class="" id="id_{{ field }}"> 
    <img src="{{ MEDIA_URL }}images/plus_sign.gif" width="10" height="10" alt="Add"/> 
</a> 

는 ^이 위젯의 ​​템플릿에 {{MEDIA_URL}}를로드 할 수 없습니다, 따라서 나는 제대로 .gif 참고 이미지를로드 할 수 없습니다. :(

# 
#custom_widgets.py 
# 
from django import forms 

class MySelectMultiple(forms.SelectMultiple): 

    def render(self, name, *args, **kwargs): 
     html = super(MySelectMultiple, self).render(name, *args, **kwargs) 
     plus = render_to_string("plus_sign.html", {'field': name}) 
     return html+plus 

# 
#forms.py 
# 
from django import forms 
from myapp.custom_widgets.py import MySelectMultiple 

class MyForm(forms.ModelForm): 
contacts = forms.ModelMultipleChoiceField(Contact.objects, required=False, widget=MySelectMultiple) 

# 
#views.py 
# 

def AddContacts(request): 
    if request.method == 'POST': 
     form = MyForm(request.POST) 

     if form.is_valid(): 
      cd = form.cleaned_data 
      new = form.save() 
      return HttpResponseRedirect('/addedContact/') 
    else: 
     form = MyForm() 

    return render_to_response('shop/my_form.html', {'form': form}, context_instance=RequestContext(request)) 


# 
#my_form.html 
# 
{% extends "base.html" %} 

{% block content %} 
    {{ form.contacts }} 
{% endblock %} 

제가 제대로 위젯의 이미지를로드 할 수있는 방법을 알려 주시기 바랍니다. 모든 응답 주셔서 너무 감사드립니다.

답변

1

실제로 올바른 방법은 Widget Media입니다.

위젯을 정의 할 때 위젯의 스타일을 지정하려면 CSS 파일을 포함해야하는 Media 내부 클래스를 정의해야합니다. 이 경우 < > 태그는 텍스트를 표시하지 않고 더하기 기호 배경 이미지를 갖습니다. 당신이 정말이 렌더링 된 위젯 내부의 MEDIA_URL을 포함해야하는 경우

class MyWidget(TexInput): 
    ... 
    class Media: 
    css = { 
     'all': ('my_widget.css',) 
    } 

, 나는 django.conf.settings에서 직접 가져 recommmend하고 렌더링 컨텍스트에서 settings.MEDIA_URL을 포함 할 것입니다.

from django.conf import settings 

class MyWidget(TextInput): 
    ... 
    def render(self): 
    return render_to_string('my_widget.html', { 
     'MEDIA_URL': settings.MEDIA_URL, 
     ... 
    }) 
+0

는 그래서 우리가 심지어 특정의 이미지 소스에 대한 CSS를 사용해야합니다 의미하지 않는다 당신에게 @Jj – Eric

+0

너무 감사합니다 이미지 경로 위치? – Eric

1

을 확인 컨텍스트 프로세서는 settings.py

에서 확인로드되는
TEMPLATE_CONTEXT_PROCESSORS=(
    ...other processors, 
    "django.core.context_processors.media", 
) 

당신이 TEMPLATE_CONTEXT_PROCESSORS를 지정하지 않은 경우 기본적으로로드되지만 지정한 경우, 위의 프로세서도 포함되어야합니다.

http://docs.djangoproject.com/en/dev/ref/settings/#template-context-processors

+0

안녕하세요 czarchaic, 답장을 보내 주셔서 감사합니다. TEMPLATE_CONTEXT_PROCESSORS = ( # ... 다른 프로세서, 'django.core.context_processors.media', ) 여전히 하지만이 작동하지 않습니다 :( – Eric

+0

을 정확하게하기 : 나는 settings.py이 추가되었습니다 , {{MEDIA_URL}}을 my_form.html에 넣으면 미디어 URL을 얻을 수 있지만 위젯은 "T – Eric

2

컨텍스트 프로세서는 RequestContext을 사용할 때만 적용됩니다. @czarchaic 언급 한 바와 같이,

from django.template import RequestContext 

def render(self, name, *args, **kwargs): 
    html = super(MySelectMultiple, self).render(name, *args, **kwargs) 
    context = RequestContext({'field': name}) 
    plus = render_to_string("plus_sign.html", context) 
    return html + plus 

그리고, 미디어 상황에 맞는 프로세서 (기본값이어야 함) TEMPLATE_CONTEXT_PROCESSORS에 있는지 확인 :

귀하의 렌더링 방법은 무엇인가해야한다.

Docs link.

+0

이 접근법에 문제가 있습니다. 위젯에 요청을 보내야 할 필요가 있습니다. RequestContext는 첫 번째 매개 변수로 요청을받습니다. –

+0

정말 고마워요 @Seth 위젯이 RequestContext를 명시 적으로 사용하지 않고 이전에 사용하는 양식의 RequestContext를 자동으로 가져올 것으로 생각하여 V로 다시 전달되는 변수를 워핑합니다. 보기. 이것은 작동합니다. 정말 고맙습니다! – Eric

+0

그러나 내가 액세스 할 수없는 것 같다 {{필드}} 위젯의 템플릿 지금 {{ field }} Eric

0

나는 우리가 또 다른 변수를 만들고, 그리고 render_to_string 방법의 두 번째 매개 변수에서 다른 변수를 통과하지 않고 MEDIA_URL에 액세스하기 위해, RequestContext을 통과, 이런 식으로 할 수 있다고 생각합니다.

우리가 사용하는 경우 : 위젯의 템플릿에

context = RequestContext({'field': name}) 

는 {{필드}} 빈에 액세스 할 수 없습니다.

다음은 {{field}}뿐 아니라 MEDIA_URL에 액세스 할 수있는 블록입니다. 그러나 복잡한 자바 스크립트 및 CSS 설정에 내부 Media 클래스를 사용하는 것에 동의합니다. 그러나 단순한 이미지 src 경로에 대해서는 이것이 가능할 것이라고 생각합니다.

def render(self, name, *args, **kwargs): 
     html = super(SelectMultipleWithModalDialog, self).render(name, *args, **kwargs)   
     **context = RequestContext({}) 
     popup_plus = render_to_string("widgets/modal_dialog_plus_sign.html", {'field': name}, context_instance=context)**   
     return html + popup_plus 

이 방법을 사용하는 것이 좋지 않으면 해결하십시오. 이 스레드의 모든 참가자에게 감사드립니다.