Как передать поля уникальных идентификаторов из модели в форму Django при циклическом просмотре модели в шаблоне? - PullRequest
0 голосов
/ 10 января 2019

Мне нужно создать уникальный идентификатор для каждой формы, которая генерируется из цикла в шаблонах Django. Я использую {% for product in products %} для просмотра некоторых данных. В моем forms.py я редактирую атрибуты form.widget.Select, чтобы добавить / изменить поля onchange и id. Я отрисовываю его через views.py и мои шаблоны как {{form}}, вот строка в forms.py:

condition = forms.ChoiceField(choices=condition_choices, widget=forms.Select(attrs={'onchange' : "showChange(this)", "id":"{{product.id}}"}))

Я ожидал, что идентификатор будет отображаться как уникальный идентификатор, связанный с каждым продуктом, и ожидал, что onchange вызовет функцию js. Когда я печатаю форму на консоль, она выглядит так:

<select name="condition" onchange="showChange(this)" id="{{product.id}}">
  <option value="NM / LP">Near Mint / Lightly Played</option>

  <option value="MP">Moderately Played</option>

  <option value="HP">Heavily Played</option>

  <option value="Damaged">Damaged</option>

  <option value="Unopened">Unopened</option>

</select>

Я бы ожидал, что поле id будет действительным идентификатором, а не {{product.id}} Если эта форма вставляется точно в html, не отображая ее как форму Django, она работает как положено. Как передать уникальный идентификатор моего продукта в формы Django, не импортируя базу данных в forms.py / дополнительные вызовы базы данных?

1 Ответ

0 голосов
/ 11 января 2019

Вы не можете использовать {{product.id}} в .py файлах. Это тег движка шаблонов Django.

В вашем views.py вы должны создать свою форму следующим образом:

product = Product.objects.get(pk=1)

form = ProductForm(instance=product)

context = {
    'form': form
}

когда вы передаете форму, вы можете использовать ее данные в методе __init__.

и ваша форма будет выглядеть так

class ProductForm(forms.ModelForm):

class Meta:
    model = Product
    exclude = ()

def __init__(self, *args, **kwargs):
    super(ProductForm, self).__init__(*args, **kwargs)
    instance = kwargs['instance']
    self.fields['condition'].widget.attrs['id'] = instance.id
...