Django: перечислить item.id как поле attr?
В моем шаблоне у меня есть:
{% for link in solution_list %}
<form id="marked_solved_form{{link.id}}" action="" method="post">
{{mark_solved_form.is_solution}}
{% csrf_token %}
<label for="id_is_solution{{link.id}}">test form</label>
<input type="hidden" name="next" value="{{ request.path }}"/>
</form>
{% endfor %}
is_solution - это просто логическое поле для флажка, который может установить пользователь.
Проблема, с которой я сталкиваюсь, состоит в том, что все формы правильно заполняются идентификаторами, такими как id="mark_solved_form3" за исключением {{mark_solved_form.is_solution}}. Я подумал, что могу просто перейти к модели и отредактировать атрибуты:
class PostMarkedSolved(ModelForm):
class Meta:
model = MarkedSolved
def __init__(self, *args, **kwargs):
super(PostMarkedSolved, self).__init__(*args, **kwargs)
#self.fields['is_solution'].queryset = Factory.objects.all()
self.fields['is_solution'].widget.attrs={'onchange':'this.form.submit();', 'class':'testing{{link.id}}', 'id':'testing{{link.id}}'}
Все идет нормально. За исключением случаев, когда форма загружается, я получаю следующее для каждого флажка в каждой форме списка:
<input name="is_solution" type="checkbox" class="testing{{link.id}}" onchange="this.form.submit();" id="testing{{link.id}}">
Как будто django игнорирует форму модели и избегает тега шаблона {{link.id}} все вместе. В идеале для каждого экземпляра формы должно быть что-то вроде:
<td>
<form id="marked_solved_form3" action="" method="post">
<input name="is_solution" type="checkbox" class="testing3" onclick="this.form.submit();" id="testing3" />
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='bwuXYhSpQA8yEOEPSaCt3wAANC0kR7CE' /></div>
<label for="id_is_solution3" onclick="this.form.submit();">test form</label>
<input type="hidden" name="next" value="/task/1"/>
</form>
</td>
<td>
<form id="marked_solved_form4" action="" method="post">
<input name="is_solution" type="checkbox" class="testing4" onclick="this.form.submit();" id="testing4" />
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='bwuXYhSpQA8yEOEPSaCt3wAANC0kR7CE' /></div>
<label for="id_is_solution4" onclick="this.form.submit();">test form</label>
<input type="hidden" name="next" value="/task/1"/>
</form>
</td>
Я даже зашел так далеко, что установил django-widget-tweaks (что круто, кстати!), И попытался сделать:
{{mark_solved_form.is_solution|attr:"id:id_is_solution{{link.id}}"}}
Однако это задохнулось, потому что он не может обрабатывать {{link.id}} внутри другого тега шаблона.:(Любые предложения будут оценены. Заранее спасибо!
2 ответа
Шаблон не может отобразить эти переменные, помещенные в __init__
метод. Вы должны иметь возможность доступа к экземпляру модели через self.instance
и добавьте правильный идентификатор в __init__
метод, выполнив следующее:
def __init__(self, *args, **kwargs):
super(PostMarkedSolved, self).__init__(*args, **kwargs)
self.fields['is_solution'].widget.attrs={
'onchange':'this.form.submit();',
'class':'testing{0}', 'id':'testing{1}'.format(self.instance.id, self.instance.id)
}
Кроме того, экземпляр формы модели, связанный с объектом модели, будет содержать атрибут self.instance, который предоставляет методам формы модели доступ к этому конкретному экземпляру модели.
Это неправильный подход. Вы должны использовать отдельные формы с префиксами, или даже лучше использовать набор форм.