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, который предоставляет методам формы модели доступ к этому конкретному экземпляру модели.

Это неправильный подход. Вы должны использовать отдельные формы с префиксами, или даже лучше использовать набор форм.

Другие вопросы по тегам