Расширение форм Джанго - PullRequest
1 голос
/ 24 февраля 2012

Я читал об этом в документации, но ничего не смог найти.

Рекомендуете ли вы расширять пользовательские формы в Django?

Вот моя проблема. Я использую Biblion, чтобы написать приложение для блога. Дело в том, что я не хочу использовать поведение по умолчанию (создавать сообщения в блоге с сайта администратора). Есть такая форма: https://github.com/eldarion/biblion/blob/master/biblion/forms.py#L13, которая имеет собственную логику для сохранения сообщения (и некоторого разбора).

Я бы хотел расширить эту форму для некоторых пользовательских действий. Например, я хотел бы заставить некоторых пользователей создавать посты в блоге, но не разрешать им публиковать. Вместо этого я должен проверить и модерировать их. Итак, ради этого я пытаюсь что-то вроде:

class PostForm(AdminPostForm):
    publish = forms.BooleanField(
        required = False,
        widget = forms.HiddenInput # don't show it
    )

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

Другой вариант - просто скопировать / вставить код из AdminPostForm, но тоже не кажется хорошим вариантом. Но если нет простого способа настроить форму для нескольких случаев, я просто сделаю это.

Идеи

Спасибо !!

Ответы [ 2 ]

5 голосов
/ 24 февраля 2012

Расширение ModelAdmin

Если вы хотите реализовать логику для каждого пользователя в ваших формах, вы можете расширить ModelAdmin вместо формы.

Здесь вам нужнодля переопределения ModelAdmin save_form метода.
save_form принимает 3 аргумента в дополнение к self: request, form, change.Вы будете делать следующее:

def save_form(self, request, form, change):
    instance = super(MyModelAdmin, self).save_form(request, form, change)
    if instance.published and not user.has_perm('mark_published'):
        instance.published = False #You could be displaying a message here.
    return instance

Обычно классы Django имеют много хуков, поэтому вы можете подключить свою собственную логику именно туда.

Зачем вамделать это?

Здесь вы просто скрываете ввод, но любой, у кого есть приличный браузер, сможет изменить это значение и опубликовать True в вашем published вводе.

0 голосов
/ 24 февраля 2012

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

Стоп.

Формы не имеют "действий". Формы предназначены только для проверки правильности ввода. ModelForms включают расширение для сохранения допустимого ввода. Фокус проверяет ввод.

Если вы хотите "действия", вы должны писать функции просмотра.

Возможно, вам также понадобится создать пользовательское действие администратора https://docs.djangoproject.com/en/1.3/ref/contrib/admin/actions/ (не форма)

Если вы хотите удалить элемент из из, сделайте это.

  1. Используйте ModelForm. https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/

  2. Список полей в значении «исключить». https://docs.djangoproject.com/en/1.3/topics/forms/modelforms/#using-a-subset-of-fields-on-the-form

...