我有一个名为的模型Domain,看起来像这样:
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操作。此模型中有一个字段需要用户输入,但外键字段不需要任何用户输入。如何从通用视图生成的表单中排除该字段,但将其分配给当前经过身份验证的用户的值。
谢谢。
看看本周早些时候Russel在django-users组上对类似问题的回答。
引用答案*:
表单和视图解决了不同的问题。 视图正在解决“如何处理此请求并将其转换为响应?”的问题。表单正在解决“如何将请求中的POST数据转换为模型对象(或更改为模型对象)?”的问题。 大致来说,一个视图正在执行以下操作: 视图收到请求 View算出这是GET还是POST 如果它是POST,则View要求Form将Post变成模型更改 表单返回成功或失败 视图响应表单的成功或失败。 视图返回响应。 表单的功能是视图功能的完整子集,因此,它是一个完全可互换的内部组件。 现在,在简单的情况下,View可能会猜测表单的所有默认值-它只需要知道您正在处理Foo模型,它就可以构造默认的Foo ModelForm。但是,如果您有更复杂的表单要求,则需要定制的表单。 我们 可以 通过在View类上公开所有ModelForm选项来实现这一点;但是为了保持所有内容的清洁,我们将ModelForm隔离开来,并为View提供了一种指定它将使用哪个Form类的方法。 因此-为了涵盖排除字段的用例,您可以定义一个排除字段的ModelForm,然后让CreateView知道您要使用的表单:
表单和视图解决了不同的问题。
视图正在解决“如何处理此请求并将其转换为响应?”的问题。表单正在解决“如何将请求中的POST数据转换为模型对象(或更改为模型对象)?”的问题。
大致来说,一个视图正在执行以下操作:
表单的功能是视图功能的完整子集,因此,它是一个完全可互换的内部组件。
现在,在简单的情况下,View可能会猜测表单的所有默认值-它只需要知道您正在处理Foo模型,它就可以构造默认的Foo ModelForm。但是,如果您有更复杂的表单要求,则需要定制的表单。
我们 可以 通过在View类上公开所有ModelForm选项来实现这一点;但是为了保持所有内容的清洁,我们将ModelForm隔离开来,并为View提供了一种指定它将使用哪个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"
我猜想当您说“为字段固定值”时,是指在保存新的Campaign实例之前设置user,name和content_inlined的值。为此,您需要向表单的表单处理逻辑中注入一些额外的代码:
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)
当表单有效时,这将覆盖默认行为,并设置额外的值。然后,form_valid()的super()实现将保存实例。 作为记录,这也可以通过重写ModelForm上的save()方法来完成;但是,如果这样做,则会丢失请求对象,如果您试图将实例值设置为某种值,那是对请求敏感的。
当表单有效时,这将覆盖默认行为,并设置额外的值。然后,form_valid()的super()实现将保存实例。
作为记录,这也可以通过重写ModelForm上的save()方法来完成;但是,如果这样做,则会丢失请求对象,如果您试图将实例值设置为某种值,那是对请求敏感的。
*原始答案集,self.object.user而不是form.instance.user。这给出了一个,AttributeError因此我在上面进行了更改。
self.object.user
form.instance.user
AttributeError