Python Django-将外键传递给第二个模型
我正在尝试为django webapp创建一个相当简单的输入视图。我已经建立了以下简单的模型。最后,我还包括了回溯。问题是如何在CreateView类中创建对象并传递父对象的外键Python Django-将外键传递给第二个模型,python,django,python-3.x,Python,Django,Python 3.x,我正在尝试为django webapp创建一个相当简单的输入视图。我已经建立了以下简单的模型。最后,我还包括了回溯。问题是如何在CreateView类中创建对象并传递父对象的外键 #models.py #imports... class Client(models.Model): client_id = models.AutoField( primary_key=True) class Item(models.Model): client = models
#models.py
#imports...
class Client(models.Model):
client_id = models.AutoField(
primary_key=True)
class Item(models.Model):
client = models.ForeignKey(
Client,
on_delete=models.CASCADE)
item_id = models.AutoField(
primary_key=True)
其思想是拥有一个独特客户机列表,然后每个客户机都可以拥有一个独特项目列表。这些项目链接到客户端
#views.py
#imports...
class ItemCreate(CreateView):
model = Item
fields = [
#list of fields
]
def form_valid(self, form):
form.instance.client_id = self.request.client.client_id
return super(PermCreate, self).form_valid(form)
给定这两个类模型,我尝试创建一个视图,它将创建一个新项并将其连接到相应的客户端。我有一个ListView,它将迭代给定客户机的项目。ListView有一个指向CreateView添加新项的链接。我对视图中的pk没有问题,甚至到CreateView也没有问题。我无法获取CreateView来保存对象。我得到一个错误,说
'WSGIRequest' object has no attribute 'client'
上面的代码源于这个问题。我已经多次尝试使用参数来设置form.instance.client_id,但请求可能是错误的调用。给出的示例使用的是用户调用,而不是表外键信息本身
我也尝试过为我的模型使用主键,我已经厌倦了从模板标签访问URL pk——但是我想如果我不能在视图对象中访问它们,那么从模板中获取将会更加困难
回溯
使现代化
更新2
测试和打印后-我认为问题出在我的请求或kwargs.get变量中。因为当我在实例中硬编码客户机id时,整个过程都是有效的——我得出结论,该实例确实存在所有适当的信息——包括URL主键——但我没有获得访问它的正确变量名。我知道它不是项目id或客户id
更新3
请求和KWARGS都可以工作。在对每一个可能的变量进行分析后,找到主键,结果是pk
因此,不是使用客户机id或项目id,而是将值保存在pk中。任何解释都会有帮助。我猜URL实际上是从我的URL.py文件中设置变量的,但不是100确定
form.instance.client_id = self.request.client.client_id
这条线应该是这样的,
form.instance.client_id = self.request.POST['client'].client_id
或
取决于请求类型。请向我们显示视图的URL配置。另外,您如何在CreateView中知道您正在使用的客户端?客户端是否链接到用户[auth.models.User]的特定实例?@solarismoke,通过对客户端id的硬编码引用,所有URL和视图都有效。我已经发布了引用,以便您可以在URL中看到pk变量。上面的代码抛出1048,列“client_id”不能为空。我确实注意到我可以使用.get方法,并且它可以工作-但是我得到了一个1048,列'client_id'不能为null的错误。这导致了上面发布的更新。请求类型为POST。我现在确实看到,我不确定从哪个对象获取form.instance,因为两个键都会产生空值。
# views.py
# Example 1
def form_valid(self, form):
form.instance.client_id = 2
return super(PermCreate, self).form_valid(form)
# Example 2
def form_valid(self, form):
pk = self.kwargs.get("perm_id", None)
form.instance.client_id = pk
return super(PermCreate, self).form_valid(form)
# Example 3
def form_valid(self, form):
pk = self.kwargs.get("client_id", None)
form.instance.client_id = pk
return super(PermCreate, self).form_valid(form)
form.instance.client_id = self.request.client.client_id
form.instance.client_id = self.request.POST['client'].client_id
form.instance.client_id = self.request.GET['client'].client_id