簡體   English   中英

Django-將外鍵傳遞給第二模型

[英]Django - Pass Foreign Key to Second Model

我正在嘗試為Django Web應用程序創建一個相當簡單的輸入視圖。 我有以下簡單的模型設置。 最后,我還包括了追溯。 問題是如何在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)

給定這兩個類模型,我嘗試創建將創建一個新Item並將其附加到相應Client CreateView 我有一個ListView ,它將迭代給定Client Items ListView具有指向CreateView (添加新項)的鏈接。 我對視圖中的pk甚至是CreateView 我無法獲得CreateView來保存對象。 我收到一條錯誤消息,說...

'WSGIRequest' object has no attribute 'client'

上面的代碼是從這個問題派生的。 我已經嘗試過對參數進行多次迭代來設置form.instance.client_id但是request可能是錯誤的調用。 給出的示例是使用user調用本身而不是表的外鍵信息。

我也嘗試過此操作 (使用模型的主鍵),並且我已經很累了從模板標簽訪問URL pk-但想出如果我無法在views對象中訪問它們,那么從模板獲取將是更加困難。

追溯

File "/anaconda3/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/anaconda3/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "/anaconda3/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/anaconda3/lib/python3.6/site-packages/django/views/generic/base.py" in view
  69.             return self.dispatch(request, *args, **kwargs)

File "/anaconda3/lib/python3.6/site-packages/django/views/generic/base.py" in dispatch
  89.         return handler(request, *args, **kwargs)

File "/anaconda3/lib/python3.6/site-packages/django/views/generic/edit.py" in post
  172.         return super().post(request, *args, **kwargs)

File "/anaconda3/lib/python3.6/site-packages/django/views/generic/edit.py" in post
  142.             return self.form_valid(form)

File "/Users/billarmstrong/Documents/GitHub/Core/WebDataCollect/Pro/ProWP/views.py" in form_valid
  55.         form.instance.client_id = self.request.client.client_id

Exception Type: AttributeError at /ProWP/2/additem/
Exception Value: 'WSGIRequest' object has no attribute 'client'

更新

# urls.py

    path('<int:pk>/additem/', views.ItemCreate.as_view(), name='item-add'),
    path('<int:pk>/item/', views.ItemView.as_view(), name='itemview'),

我也取得了一些進步。 我開始使用示例1代碼,發現如果我設置form.instance.client_id = 2 ,它將適當地添加外鍵為2的對象。 因此,問題在於嘗試獲取原始POST pk 我嘗試了示例2,並拋出了錯誤(1048, "column 'client_id' cannot be null") ,這意味着我沒有得到Item對象。 因此,我嘗試了示例3和(1048, "Column 'client_id' cannot be null")

# 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)

更新2

經過測試和print后-我認為問題出在我的requestkwargs.get變量中。 由於當我在實例中對client_id進行硬編碼時,整個過程都可以工作-我得出的結論是,該實例實際上與所有適當的信息一起存在-包括URL主鍵-但我沒有獲得正確的變量名來訪問它。 我知道它不是item_idclient_id

更新3

requestKWARGS工作。 處理完所有可能的變量以獲取主鍵后,結果就是pk

因此,該值不使用client_iditem_id ,而是保存在pk 任何解釋都會有所幫助。 我猜想URL實際上是從我的urls.py文件中設置了變量-但不是100肯定的。

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

根據請求類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM