Автор Тема: Ошибка при назначении своего собственного виджета  (Прочитано 1205 раз)

AdminUser

  • Team Lead
  • Юный джедай
  • *****
  • Сообщений: 65
  • Репутация +8/-0
    • Просмотр профиля
Всем привет!

Написал кастомный виджет:

class EmptyWidget(Widget):
    template_name = 'widgets/empty.html'

    def get_context(self, name, value, attrs=None):
        return {'widget': {
            'name': name,
            'value': value,
        }}

    def render(self, name, value, attrs=None):
        print '========================'
        context = self.get_context(name, value, attrs)
        template = loader.get_template(self.template_name).render(context)
        return mark_safe(template)

Но когда назначаю его в форме через

        widgets = {
            'TargetProfile': EmptyWidget()
        }


то ничего не происходит: TargetProfile отображается как обычный SlugField. Если назначаю так:

TargetProfile = forms.SlugField(label='Автор', initial='',widget = EmptyWidget)     
то получаю ошибку
Цитата:
global name 'loader' is not defined


Полный код:

from main.widgets import EmptyWidget

class RatingForm(forms.ModelForm):

    TargetProfile = forms.SlugField(label='Автор', initial='',widget = EmptyWidget)                     

    class Meta(object):

        model = Raiting
        fields =  ('Value', 'Target')                                    
            'Value': 'Оценка',
            'Target': 'К записи',
        }
        help_texts = {
            'Value': ('Изменить значение'),
        }
        widgets = {
            'TargetProfile': EmptyWidget()
        }

    def __init__(self, *args, **kwargs):

        if kwargs.__contains__(u'instance'):                                             #скорее всего для python3 другое...
            if kwargs[u'instance']:
                kwargs.update(initial={
                    # 'field': 'value'
                    'TargetProfile': kwargs[u'instance'].Target.From                     # переопределит get_fields в TabularInline
                })

            print kwargs[u'instance']

        super(RatingForm, self).__init__(*args, **kwargs)

        self.submit = u'Оценить'
        self.css_class = ''

Полный код ошибки:

Цитата:
Request Method:   GET
Request URL:   http://127.0.0.1:8000/raiting/
Django Version:   1.11.17
Exception Type:   NameError
Exception Value:   
global name 'loader' is not defined

Error during template rendering


Что это за ошибка?

AdminUser

  • Team Lead
  • Юный джедай
  • *****
  • Сообщений: 65
  • Репутация +8/-0
    • Просмотр профиля
Обнаружил, что ошибка здесь:

    def render(self, name, value, attrs=None):
        print '========================'
        context = self.get_context(name, value, attrs)
        template = loader.get_template(self.template_name).render(context)
        return mark_safe(template)


Был не объявлен loader. Закомментировал весь блок. Теперь другая ошибка:

Цитата:
Invalid block tag on line 1: 'value'. Did you forget to register or load this tag?
1   <div style='color:brown'id="mywidget-{{ widget.name }}">{% value %}</div>

DigitalMag

  • Юный джедай
  • **
  • Сообщений: 89
  • Репутация +6/-0
    • Просмотр профиля
Замените {% %} на {{ }} так:

<div style='color:brown'id="mywidget-{{ widget.name }}">{{ widget.value }}</div>
« Последнее редактирование: Марта 09, 2019, 11:56:59 am от DigitalMag »