Ved-форум поддержки
Программирование => Django => Тема начата: 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
Что это за ошибка?
-
Обнаружил, что ошибка здесь:
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>
-
Замените {% %} на {{ }} так:
<div style='color:brown'id="mywidget-{{ widget.name }}">{{ widget.value }}</div>