Исключение полей в общих представлениях CRUD - PullRequest
1 голос
/ 17 июля 2011

У меня есть модель с именем Domain, которая выглядит следующим образом:

class Domain(models.Model):
    """
    Model for storing the company domains
    """
    user = models.ForeignKey(
        User
    )
    host = models.CharField(
        null=False, verbose_name="Host", max_length=128, unique=True
    )

Я хотел бы использовать общие представления Django для выполнения операций CRUD над этим.В этой модели есть одно поле, которое требует ввода данных пользователем, но поле внешнего ключа не требует ввода данных пользователем.Как я могу исключить это поле из формы, которую генерирует мое общее представление, но присвоить ему значение текущего аутентифицированного пользователя.

Спасибо.

1 Ответ

2 голосов
/ 17 июля 2011

Посмотрите на ответ Рассела на похожий вопрос в группе пользователей django в начале этой недели.

Цитирование ответа *:

Формыи представления решают различные проблемы.

представление решает проблему «как мне обработать этот запрос и преобразовать его в ответ?».Форма решает проблему «Как преобразовать данные POST в этом запросе в объект модели (или изменение в объект модели)?».

Очень грубо, представление выполняет следующее:

  1. View получает запрос
  2. View определяет, является ли это GET или POST
  3. Если это POST, View запрашивает форму, чтобы превратить сообщение визменение модели
  4. Форма возвращает успех или неудачу
  5. Просмотр реагирует на успех или неудачу формы.
  6. Просмотр возвращает ответ.

Функциональные возможности формы являются полным подмножеством функциональных возможностей представления - и по этой причине это полностью взаимозаменяемый внутренний компонент.

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

Мы могли бы реализовать это, предоставив все опции ModelForm в классе View;но чтобы сохранить все в чистоте, мы сохранили изолированную ModelForm и предоставили представлению способ указать, какой класс Form он будет использовать.

Итак, чтобы охватить ваш случай использования исключения полей, вы определяетеModelForm, которая исключает поля, а затем сообщите CreateView форму, которую вы хотите использовать:

class CampaignForm(forms.ModelForm):


    class Meta:
        model = Campaign
        exclude = ('user', 'name', 'content_inlined')

class CreateCampaignView(CreateView):
    form_class = CampaignForm
    template_name = "forms/create.html"

Я предполагаю, что когда вы говорите «исправить значения для поля»,Вы имеете в виду установку значений user, name и content_inlined перед сохранением нового экземпляра Campaign;чтобы сделать это, вам нужно добавить какой-то дополнительный код в логику обработки формы:

class CreateCampaignView(CreateView):
    form_class = CampaignForm
    template_name = "forms/create.html"

    def form_valid(self, form):
        form.instance.user = ... (something meaningful.. e.g., self.request.user)
        return super(CreateCampaignView, self).form_valid(form)

Это переопределяет поведение по умолчанию, когда форма действительна, и устанавливает дополнительныйценности.Реализация super () для form_valid () затем сохранит экземпляр.

Для записи это также можно сделать, переопределив метод save () в ModelForm - однако, если вы это сделаете, выпотерять объект запроса, который вам понадобится, если вы пытаетесь установить значения экземпляров, которые чувствительны к запросу.

* исходный набор ответов self.object.user вместо form.instance.user.Это дает AttributeError, поэтому я изменил его выше.

...