当前位置: 首页 > 面试题库 >

排除通用CRUD视图中的字段

易骁
2023-03-14
问题内容

我有一个名为的模型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数据转换为模型对象(或更改为模型对象)?”的问题。

大致来说,一个视图正在执行以下操作:

  1. 视图收到请求
  2. View算出这是GET还是POST
  3. 如果它是POST,则View要求Form将Post变成模型更改
  4. 表单返回成功或失败
  5. 视图响应表单的成功或失败。
  6. 视图返回响应。

表单的功能是视图功能的完整子集,因此,它是一个完全可互换的内部组件。

现在,在简单的情况下,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()方法来完成;但是,如果这样做,则会丢失请求对象,如果您试图将实例值设置为某种值,那是对请求敏感的。

*原始答案集,self.object.user而不是form.instance.user。这给出了一个,AttributeError因此我在上面进行了更改。



 类似资料:
  • 问题内容: 我有2节课: 和 默认情况下,如果我改变类的实例到XML,我将所有的字段()和引用类字段(,,)是这样的: 是否可以修改引用的类的 哪些 字段包含在该类的XML中?例如,我想说的是,当我转换类的实例时,我只想从该类中获取(否和字段),所以我想要获得: 我并不想永久注释类(使用或)来实现它,因为有我在其中要导出整个案件类的是(与,和)。 我只是不想导出所有这些领域时在类是从引用。 JAX

  • 问题内容: 我需要创建一个自动在结果中添加虚拟行号的视图。这里的图完全是随机的,我要实现的是动态创建的最后一列。 查询: 问题答案: 采用: 这不是理想的方式,因为将对返回的每一行执行num值查询。更好的主意是创建一个表,其中的一列包含一个从一个开始的数字,然后递增到一个非常大的数字,然后以类似于下面的变量示例的方式联接和引用该表。 MySQL排名,或缺乏 您可以定义一个变量以获得伪行号功能,因为

  • 我有一个相当大的实体,有许多字段和几个与该实体交互的方法。当两个线程同时从数据库中读取数据时,存在不可重复读取的问题,其中一个线程更改了一个字段并保存了实体,而另一个线程同时读取了旧值的数据并没有更改并保存。我想的第一个解决方案是将事务隔离级别改为可重复读取,但这可能会对我的应用程序的性能产生巨大影响。我只需要在第二个方法中忽略一个字段,但在第一个方法中更改它,所以@transient注释在这里不

  • 主要内容:静态网页,从数据库列表和显示数据在某些情况下编写视图代码,正如我们所看到前面工作真的很繁重。想象一下,只需要一个静态页面或列表页。 Django还提供了一种简单的方法来设置这些简单的视图被称为通用视图。 不同于传统的视图,一般的视图是一个类但没有函数。Django还提供了一组类 django.views.generic 通用视图,以及每一个普通视图是这些类或从它们中的一个类继承的。 有10+泛型类− 你可以使用通用视图。让我们来

  • 通用视图 基于类的视图的一个主要优点是它们允许你编写可重复使用的行为。 REST framework 通过提供大量预构建视图来提供常用模式,从而充分利用了这一点。 REST framework 提供的通用视图允许您快速构建紧密映射到数据库模型的 API 视图。 如果通用视图不符合需求,可以使用常规的 APIView 类,或者利用 mixin 特性和基类组合出可重用的视图。 举个栗子 通常,在使用通

  • 我有一个如下定义的表视图 当用户单击时,我使用单击的项目详细信息重新加载表。在我重新加载之前,我对表项调用清除 现在,当我单击另一个项目并尝试重新加载表格时,它看起来像下面这样。这是非常奇怪的,因为应该只有一行,但行的大小是一样的,就像从以前的点击,其余的行是空的,除了图标。当我点击图标时,没有任何反应。任何人以前都面临过这种情况。有人知道这是什么原因吗? 我的工具定义如下。它们只是2 的