Использование форм Django для отображения и редактирования? - PullRequest
7 голосов
/ 15 декабря 2009

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

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

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

{{form.field_name | render_field: mode}}

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

Я что-то пропустил или это жизнеспособное решение?

Ответы [ 5 ]

4 голосов
/ 16 января 2010

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

  1. прикрепите модель к форме, поэтому у меня будут стандартные виджеты для каждого поля
  2. написать форму с помощью тега шаблона, передавая ему поле form.field, user и action
  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
0 голосов
/ 08 января 2010

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

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

0 голосов
/ 15 декабря 2009

в основном шаблоне

{% if form %}
    {% include 'form.html' %}
{% else %}
    {% include 'display.html' %}
{% endif %}

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

Я делаю это в приложении для блога, чтобы страница редактирования выглядела точно так же, как и страница отображения, поэтому редактировать / писать записи в блоге чрезвычайно интуитивно. (не говоря уже об этом, я могу очень легко добавить немного ajax для редактирования записей в любом представлении с некоторыми красивыми причудливыми эффектами)

0 голосов
/ 17 декабря 2009

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

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

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

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

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

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

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

0 голосов
/ 15 декабря 2009

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

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

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