Джанго, как разобрать одно поле формы (HTML) без цикла for - PullRequest
2 голосов
/ 19 апреля 2011

Я хочу анализировать поля моей модели отдельно, а не в цикле for.И я хочу, чтобы некоторые поля анализировали HTML-код Django для этого элемента.У меня есть это:

<form action="#" method="POST" name="notifictaionForm">
    <ul>  
        <li><label>{{ form.fields.title.label }}</label> <span>{{ notification.title }}</span></li>
        <li><label>{{ form.fields.create_date.label }}</label> <span>{{ notification.create_date }}</span></li>
        <li><label>{{ form.fields.description.label }}</label> <span>{{ notification.description }}</span></li>
        <li><label>{{ form.fields.status.label }}</label> <span>{{ form.fields.status.??? }}</span></li>
    </ul>
</form>

Так что я могу разобрать имя поля, но не элемент HTML, я хочу в ??? в коде шаблона для анализа элемента формы Django HTML.

Кто-нибудь знает, как это сделать?

1 Ответ

9 голосов
/ 19 апреля 2011

Если я вас хорошо понял, вы хотите автоматически сгенерированный html от django для поля status?Тогда это очень просто:

{{ form.status }}

Несколько лишних слов:

Форма - это объект, похожий на диктовку, где к полям можно получить доступ следующим образом:

>>> form['field_name']

Объявленные поля хранятся в form.fields, SortedDict объекте.Таким образом, вы можете использовать эту переменную для доступа к полям, однако рекомендуемый способ всегда самый короткий.

Если вы новичок в Python, вам может быть интересно, как это так, что вы объявляете поля как атрибуты, однако вы неполучить доступ к ним из кода Python следующим образом:

>>> form.field_name
AttributeError: 'Form' object has no attribute 'field_name'

Ну, это потому, что классы в Python не являются статичными, мета-класс может использоваться для создания всех видов новых вещей из определения класса.Django использует его для создания дружественного API.В основном это выглядит так:

  1. Интерпретатор Python анализирует ваш класс Form.
  2. Интерпретатор находит атрибут __metaclass__, который унаследован от django.forms.Form и имеет значение: DeclarativeFieldsMetaclass .
  3. Метакласс реструктурирует ваш класс.Атрибуты удаляются и создается атрибут .base_fields.
  4. Почему base_fields не fields?Ну, это другая история, это связано с тем, как поля, полученные из моделей в ModelForm, отделены от полей, объявленных в классе формы.

Но не путайте метаклассы с class Meta, который иногда используетсячтобы предоставить дополнительные параметры конфигурации для вашей формы или модели.

Назад к шаблонам сейчас.Вы не можете получить доступ к form.field_name из кода Python, почему тогда это возможно в шаблоне?Как описано в документации django , когда система шаблонов обнаруживает точку, она пытается выполнить следующие операции поиска в следующем порядке:

  • Поиск по словарю
  • Поиск по атрибутам
  • Вызов метода
  • Поиск по индексу списка

Это означает, что система шаблонов первым делом попытается вернуться при обнаружении: {{ form.field_name }} is: form['field_name'].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...