Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django CreateView中创建对象后添加指令?_Python_Django_Create View - Fatal编程技术网

Python 如何在Django CreateView中创建对象后添加指令?

Python 如何在Django CreateView中创建对象后添加指令?,python,django,create-view,Python,Django,Create View,在基于泛型类的CreateView上,我想执行一条指令,从与当前创建的对象相关的另一个模型创建新对象 示例:集合是一个与3个不同的元素对象相关的模型。当我创建与集合和用户相关的MyCollection对象时,3MyElement对象也必须创建,并与新创建的MyCollection对象相关。与集合相关的元素各一个 #models.py 从django.contrib.auth.models导入用户 从django.db导入模型 类集合(models.Model): #属性和方法。。。 类元素(mo

在基于泛型类的CreateView上,我想执行一条指令,从与当前创建的对象相关的另一个模型创建新对象

示例:
集合
是一个与3个不同的
元素
对象相关的模型。当我创建与
集合
用户
相关的
MyCollection
对象时,3
MyElement
对象也必须创建,并与新创建的
MyCollection
对象相关。与
集合
相关的
元素各一个

#models.py
从django.contrib.auth.models导入用户
从django.db导入模型
类集合(models.Model):
#属性和方法。。。
类元素(models.Model):
collection=models.ForeignKey(集合,#更多参数…)
#更多属性和方法
类MyCollection(models.Model):
user=models.ForeignKey(用户,#更多参数…)
collection==models.ForeignKey(集合,#更多参数…)
#更多属性和方法
def get_绝对_url(自身):
反向(带有对象pk的某个url)
MyElement类(models.Model):
element=models.ForeignKey(element,#更多参数…)
my#collection=models.ForeignKey(MyCollection,#更多参数…)
#更多属性和方法
我正在使用Django的通用CreateView,经过一点研究,我发现可以通过覆盖get_success_url()方法在CreateView中执行其他操作

在我的例子中,我做了类似的事情:

#views.py
从django.views.generic导入CreateView
from.utils导入为\u mycollection创建\u myelements\u
类MyCollectionCreateView(CreateView):
模型=MyCollection
#更多属性和方法。。。
def get_success_url(自我):
为_mycollection(self.get_object())创建_myelements _#这里是错误发生的地方,没有这一行就可以正常工作
return super().get_success_url())
#utils.py
from.models导入集合、元素、MyCollection、MyElement
为我的收藏(我的收藏)创建我的收藏:
对于my_collection.collection.elements_set.all()中的元素:
MyElement.objects.create(
元素=元素,
我的收藏=我的收藏,
)
#url.py
从django.url导入re_路径
从…起导入视图
URL模式=[
雷乌路(
r“^myelement/l/$”,
views.MyElementListView.as_view(),
),
雷乌路(
r“^myelement/r/(?P[0-9]+)/$”,
views.MyElementDetailView.as_view(),
),
雷乌路(
r“^myelement/c/(?P\d+/$”,
views.MyElementCreateView.as_view(),
),
雷乌路(
r“^mycollection/l/$”,
views.MyCollectionListView.as_view(),
),
雷乌路(
r“^mycollection/r/(?P[0-9]+)/$”,
views.MyCollectionDetailView.as_view(),
),
雷乌路(
r“^mycollection/c/(?P\d+/$”,
views.MyCollectionCreateView.as_view(),
),
]
当我创建一个新的
MyCollection
对象时,所有
MyElements
都在数据库中成功创建,但我遇到了以下错误:

AttributeError:Generic detail view MyCollectionCreateView必须在URLconf中使用对象pk或slug调用

我不明白为什么

我的CreateView url没有任何pk,因为创建新对象时,它还没有pk。而且,
MyCollection
有自己的
get\u absolute\u url
。没有具体的指导,我的工作很好

有人能解释一下是什么导致了错误,以及在对象创建之后是否有更好的方法来执行这样的指令吗

谢谢你的帮助

FYI:

Django 3.1
Pyhton 3.8
编辑

我尝试使用post_save信号来代替(这实际上是一种更干净的写入方式),但我遇到了完全相同的错误

#models.py
从django.db.models.signals导入后保存
从django.dispatch导入接收方
from.utils导入为\u mycollection创建\u myelements\u
#…模型
@接收方(保存后,发送方=MyCollection)
def为mycollection创建myelements(发送方,实例,**kwargs):
如果创建了实例:#?(尚未查看如何在信号中写入此条件)
为我的收藏(我的收藏)创建我的收藏
AttributeError:Generic detail view MyCollectionCreateView必须在URLconf中使用对象pk或slug调用

编辑2

通过从
MyCollectionCreateView
类中删除
get\u absolute\u url()
覆盖,它实际上可以工作。这很好,但我仍然想知道问题是什么。如果这解决了问题,可能是我没看到的愚蠢的事情

#models.py
# ... 先前代码
类MyCollectionCreateView(CreateView):
模型=MyCollection
#更多属性和方法。。。
#删除此选项解决了问题
#def get_success_url(自我):
#为\u mycollection创建\u myelements\u(self.get\u object())
#
#return super().get_success_url())
#更多代码。。。
get\u absolute\u url()
在为模型创建新实例时使用,因为django必须知道创建新帖子或创建新实例时要去哪里

从错误中

AttributeError:Generic detail view MyCollectionCreateView必须在URLconf中使用对象pk或slug调用

它告诉您必须使用
对象pk
slug
调用它,因此URL的构造就是问题所在。我不确定方法
create\u myelements\u for\u mycollection()
是否满足需要

理想情况下,你需要的是,例如

def get_absolute_url(self):
    return f"/mycollection/{self.slug}/"
要在上面的模式中生成
URL
,例如在锚定标记中使用。

您可以添加UR吗