假设我想创建一个Class Based View,它既更新,又创建一个对象。从一个previous question我计算出我可以做以下事情之一:
1)使用两个通用视图CreateView
和UpdateView
,我认为这意味着有两个URL指向两个不同的类。
2)使用一个继承了View
的基于类的视图,我认为这意味着有两个URL指向一个类(我创建了继承了View
的类)。
我有两个问题:
a)哪个更好?
B)ccbv.co.uk显示了一个基本的View
,但我没有看到任何get,post等方法的文档,这是正确的吗?
8条答案
按热度按时间vxf3dgd41#
我遇到了一个情况,我想要这样的东西。下面是我的想法(请注意,如果你试图将其用作更新视图,而它无法找到所请求的对象,它将表现为创建视图,而不是抛出404):
事实证明,
UpdateView
和CreateView
继承自完全相同的类和mixin。唯一的区别是get/post方法。以下是它们在Django源代码(1.8.2)中的定义:如您所见,CreateView get和post方法设置了
self.object = None
,而UpdateView
将其设置为self.get_object()
。我所做的就是在我的CreateUpdateView.get_object
方法中将这两个结合起来,该方法试图调用父类'get_object
并返回None
,而不是在没有对象的情况下引发异常。要将404页面用作更新视图,您可能需要覆盖
as_view
并向其传递update_only
布尔参数。如果update_only
是True
,并且视图找不到对象,则引发404。qgzx9mmu2#
就像@scubabuddha建议的那样,我遇到了类似的情况,我使用了他的回答,修改为@mario-orlandi在评论中建议的:
我在Django 1.11中使用了这个解决方案,但我认为它可以在Django 2.0中工作。
更新
我确认此解决方案适用于Django 2.0/2.1/2.2
zvokhttg3#
最简单,基本上是所有link中最好的解决方案
谢谢@chriskief
snz8szmq4#
如果你不需要引发404,并且希望所有字段都为空,如果对象不存在,在第一次保存和更新时创建对象,当它存在时,你可以使用这个。
views.py
forms.py
neekobn85#
为什么需要通过一个视图来处理创建和更新?拥有两个单独的视图要简单得多,每个视图都继承自其各自的泛型视图类。如果您愿意,它们可以共享相同的表单和模板,而且它们很可能来自不同的URL,所以我不知道将其制作成单个视图会得到什么。
所以:使用两个视图,一个继承自
CreateView
,另一个继承自UpdateView
。这些方法几乎可以处理您可能需要的所有内容,而第二种方法则需要您自己重新发明轮子。如果在创建或更新对象时使用一些常见的“内务”代码,可以选择使用mixin,或者您可以创建自己的视图,涵盖这两种用例,继承CreateView
和UpdateView
。vatpfxk56#
你也可以使用Django Smartmin,它的灵感来自Django的CBV。下面是文档中的一个示例:https://smartmin.readthedocs.org/en/latest/quickstart.html
xxls0lw87#
要在
UpdateView
和CreateView
之间共享代码,您可以使用一个公共超类作为mixin,而不是创建一个组合类。这样,可能更容易分离不同的关注点。而且-你可以重用大量现有的Django代码。evrscar28#
在我的例子中,它是如何适应UpdateView与Singleton提供的答案。这就是为什么我把硬编码pk=1。简化类:
https://docs.djangoproject.com/en/4.2/ref/models/querysets/#update-or-create