Используя Django Forms, чтобы отобразиться и отредактировать?

Я борюсь с тем, как лучше всего создать страницы HTML в Django, который может или использоваться для отображения или редактирования данных. Таким образом, я хотел бы, чтобы значения поля появились как текст в режиме отображения, но в их виджетах, когда в редактируют/добавляют режим. Кажется, что Django не был разработан, чтобы сделать это: поля всегда появляются в их виджетах (например, ввод текста, текстовая область, и т.д.).

Существует ли общая техника для обработки этого, за исключением использования форм для одной а не другого?

Я думал о пользовательском фильтре templatetag, который мог использоваться для каждого поля формы, как:

{{форма field_name|render_field:mode}}

куда render_field или возвратил бы виджет HTML поля или просто значение как текст, на основе режима.

Я пропустил что-то, или действительно ли это - эффективное решение?

7
задан Doug Blank 15 December 2009 в 12:07
поделиться

4 ответа

, отвечая на мой собственный вопрос, видимо. Я оказался с трехсторонним решением:

  1. прикрепите модель к форме, поэтому у меня будет виджеты дисплея по умолчанию для каждого поля
  2. , напишите форму, используя тег шаблона, передавая его форму. Пользователь, и действие
  3. Написать тег рендеринга шаблона для обработки # 2

Шаг один:

form.model = Model(...)

Шаг два:


 {{form.field1.label}}
 {% render form.field1 user action %}


 {{form.field2.label}}
 {% render form.field2 user action %}

Шаг три:

Что-то вроде:

def render(formfield, user, action, default_text="Private"):
    if not user.is_authenticated():
        action = "view"
    if action == "view":
        if user.is_authenticated():
            fieldname = formfield.name 
            retval = str(getattr(formfield.form.model, fieldname))
        else:
            retval = default_text
    else:
        retval = formfield.as_widget()
    return retval
4
ответ дан 7 December 2019 в 14:33
поделиться

Я что-то пропустил

Формы не только отображают виджеты полей, но и обрабатывают данные публикации. Отправленное сообщение заставит его обработать очистку данных, обработку ошибок формы и полей и т. Д.

Это своего рода нарушение шаблона - зачем создавать и отображать объект формы только для того, чтобы настроить его так, чтобы он не выглядел как форма?

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

{% if form %}
    {% for error in form.field.errors %}
        {{ error|escape }}
    {% endfor %}
    {{ form.field }}
{% else %}
    {{ object.field }}
{% endif %}

для каждого поля, но, IMO, дело не в этом, YMMV.

Также на ум (думая о вашем решении) приходит следующее: динамически прикреплять виджеты к полям формы, но это было бы слишком сложно.

0
ответ дан 7 December 2019 в 14:33
поделиться

Поскольку вы сохраняете данные, вы должны каким-то образом прикрепить модель к форме, будь то модель или нет. Таким образом, вы можете просто использовать эту модель напрямую, чтобы получить значения и отобразить их в шаблоне, как вы хотите.

Вышеупомянутое предложение было бы возможным, но поскольку формы могут быть довольно сложными, это, вероятно, непростая задача или стоит беспокоиться . Зависит от того, как часто вы хотите это делать. Но тогда, вероятно, будет проще создать фильтр для модели вместо формы.

0
ответ дан 7 December 2019 в 14:33
поделиться

У меня такая же проблема. Сейчас у меня есть отдельные шаблоны для отображения и редактирования; первый отображает поля объекта, второй - поля формы (но иногда также поля объекта, для вещей, которые не редактируются). Структура HTML может быть довольно сложной: например, на некоторых страницах у меня есть большие таблицы, представляющие многоуровневую иерархию объектов. В результате я получаю большое количество дублированного кода в двух шаблонах, что является противоположностью DRY.

Раньше я использовал фильтры шаблонов с полями формы, чтобы сохранить код при отображении ошибок вместе с полем. Думаю, в данном случае это было бы жизнеспособным решением. Другой возможностью может быть использование подкласса ModelForm, которому можно приказать отображать нередактируемые версии полей. Это поможет сохранить простые шаблоны. Вы даже можете визуализировать как статическую, так и редактируемую версию поля и использовать JavaScript для переключения между ними, активируя и деактивируя режим редактирования.

0
ответ дан 7 December 2019 в 14:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: