Не удается получить MEDIA_URL из шаблона виджета Django - PullRequest
3 голосов
/ 17 апреля 2010

Я новый Djangoer, и выясняю, как создать собственный виджет, моя проблема в том, что я не могу получить MEDIA_URL в шаблоне моего виджета, в то время как форма использует MySelectWidget, способную получить сам 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 %}

Пожалуйста, дайте мне знать, как правильно загрузить изображение виджета. Большое спасибо за все ответы.

Ответы [ 4 ]

2 голосов
/ 17 апреля 2010

Контекстные процессоры применяются только при использовании RequestContext.

Ваш метод рендеринга должен выглядеть примерно так:

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

И, как было упомянуто @czarchaic, убедитесь, что процессор медиа-контекста находится в TEMPLATE_CONTEXT_PROCESSORS (он должен быть по умолчанию).

Ссылка на документацию .

1 голос
/ 17 апреля 2010

На самом деле правильный способ сделать это - использовать Widget Media .

При определении вашего виджета вы должны определить внутренний класс Media, в который вы должны включить CSS-файл для стилизации вашего виджета. В этом случае сделайте тег , чтобы текст не отображался и имел фоновое изображение со знаком плюс.

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

Если вам действительно нужно включить MEDIA_URL в визуализированный виджет, я бы рекомендовал импортировать его непосредственно из django.conf.settings и включить 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,
      ...
    })
1 голос
/ 17 апреля 2010

Убедитесь, что контекстный процессор загружается в 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 голосов
/ 17 апреля 2010

Я думаю, что мы можем сделать так, чтобы передать RequestContext, чтобы получить доступ к MEDIA_URL без создания другой переменной и передачи других переменных во 2-м параметре метода render_to_string.

Если мы используем:

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

{{field}} в шаблоне виджета пусто и не может получить к нему доступ.

Вот блок, который может получить доступ к MEDIA_URL, а также {{field}}. Тем не менее, я согласен с использованием внутреннего класса Media для сложных настроек JavaScript и CSS. Тем не менее, я думаю, что для простого пути 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

Пожалуйста, поправьте меня, если это не очень хороший способ сделать это. Спасибо всем участникам этой темы.

...