Я пытаюсь создать довольно простой вид ввода для веб-приложения Django. У меня есть следующие простые модели. В конце я также включил трассировку. Вопрос в том, как создать объект в классе 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)
Учитывая эти две модели классов, я пытаюсь CreateView
, чтобы создать новый Item
и привязать его к соответствующему Client
. У меня есть ListView
, который будет перебирать Items
для данного Client
. ListView
имеет ссылку на CreateView
(Добавить новый элемент). У меня нет проблем с pk
в представлениях или даже с получением CreateView
. Я не могу получить CreateView
, чтобы спасти объект. Я получаю сообщение об ошибке ...
'WSGIRequest' object has no attribute 'client'
Код выше получен из этого вопроса. Я пробовал несколько итераций аргумента для установки form.instance.client_id
, но request
, скорее всего, неправильный вызов. В приведенных примерах используются user
вызовы, которые не являются данными внешнего ключа таблицы.
Я также пытался это (используя первичные ключи для моих моделей), и я устал от доступа к URL-адресу pk из тегов шаблона - но решил, что не могу получить к ним доступ в рассматривает объект, который будет сложнее получить из шаблона.
Traceback
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
ing - я думаю, проблема в моей переменной request
или kwargs.get
. Поскольку все это работает, когда я жестко кодирую client_id
в экземпляре - я пришел к выводу, что экземпляр действительно существует со всей соответствующей информацией - включая первичный ключ URL - но я не получаю правильное имя переменной чтобы получить к нему доступ. Я знаю, что это не item_id
или client_id
.
Обновление 3
Оба request
и KWARGS
работают. После прохождения всех возможных переменных, чтобы добраться до первичного ключа, получилось pk
.
Поэтому вместо использования client_id
или item_id
значение сохраняется в pk
. Любое объяснение было бы полезно. Я предполагаю, что URL на самом деле устанавливает переменную из моего urls.py
файла - но не точно 100.