Ved-форум поддержки

Программирование => Django => Тема начата: AdminUser от Марта 04, 2019, 02:44:53 pm

Название: Ошибка при назначении своего собственного виджета
Отправлено: AdminUser от Марта 04, 2019, 02:44:53 pm
Всем привет!

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

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


Что это за ошибка?
Название: Re: Ошибка при назначении своего собственного виджета
Отправлено: AdminUser от Марта 04, 2019, 02:48:39 pm
Обнаружил, что ошибка здесь:

    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>
Название: Re: Ошибка при назначении своего собственного виджета
Отправлено: DigitalMag от Марта 04, 2019, 03:48:28 pm
Замените {% %} на {{ }} так:

<div style='color:brown'id="mywidget-{{ widget.name }}">{{ widget.value }}</div>