#django #django-forms
#django #django-forms
Вопрос:
Я понимаю, что по умолчанию Django автоматически заполняет идентификатор для каждого поля формы при рендеринге с использованием формата id_for_%s
. Можно изменить формат, предоставив auto_id
конструктору формы аргумент с другим форматом в качестве его значения.
Однако это не совсем то, что я ищу. Чего я хочу добиться, так это изменить идентификатор только одного из многих полей в моей форме. Кроме того, решение не должно нарушать использование form = MyForm(request.POST)
.
PS. MyForm — это форма модели, поэтому каждый идентификатор является производным от соответствующего поля модели.
Спасибо за помощь.
Комментарии:
1. Не могли бы вы избежать использования класса? Это, конечно, намного проще и менее подвержено ошибкам (просто нужно изменить виджет).
2. @sdolan — я забыл упомянуть, что этот вопрос касался формы модели. Я ищу решения, отличные от изменения имени поля модели.
3. Вам не пришлось бы. Это будет просто обновление виджета поля при создании
ModelForm
. Если это сработает, я опубликую полное решение в качестве ответа.4. @sdolan — я попытался обновить виджет поля
__init__
, который нарушает логикуform = MyForm(request.POST)
при отправке пользовательских данных обратно на сервер. Если только ваше решение не отличается.5. Я опубликовал ответ об изменении имен классов. Посмотрите, сработает ли это для вашего варианта использования.
Ответ №1:
Структура forms, похоже, генерирует здесь метки:
def _id_for_label(self):
"""
Wrapper around the field widget's `id_for_label` class method.
Useful, for example, for focusing on this field regardless of whether
it has a single widget or a MutiWidget.
"""
widget = self.field.widget
id_ = widget.attrs.get('id') or self.auto_id
return widget.id_for_label(id_)
id_for_label = property(_id_for_label)
Это означает, что вы можете просто снабдить свой полевой виджет ключом «id», чтобы установить для него то, что вы хотите.
foo = forms.CharField(widget=forms.TextInput(attrs={'id': 'foobar'}))
Или переопределите init и установите attrs после инициализации формы.
Я не понимаю, как это может привести к поломке формы, поскольку фреймворк django forms никогда не знает об идентификаторах HTML (эти данные не передаются на сервер …)
Комментарии:
1. Юджи — Ты прав. Изменение идентификатора не нарушает структуру форм django. Я перепутал имя и идентификатор атрибутов html. Это атрибут name , который Django использует для сопоставления формы с экземпляром модели. Спасибо за ответ.