[英]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)
經過測試和print
后-我認為問題出在我的request
或kwargs.get
變量中。 由於當我在實例中對client_id
進行硬編碼時,整個過程都可以工作-我得出的結論是,該實例實際上與所有適當的信息一起存在-包括URL主鍵-但我沒有獲得正確的變量名來訪問它。 我知道它不是item_id
或client_id
。
request
和KWARGS
工作。 處理完所有可能的變量以獲取主鍵后,結果就是pk
。
因此,該值不使用client_id
或item_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.