Django: измените идентификатор DOM на уровне поля формы

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