Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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-将外键传递给第二个模型_Python_Django_Python 3.x - Fatal编程技术网

Python Django-将外键传递给第二个模型

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

我正在尝试为django webapp创建一个相当简单的输入视图。我已经建立了以下简单的模型。最后,我还包括了回溯。问题是如何在CreateView类中创建对象并传递父对象的外键

#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