Джанго - передать внешний ключ второй модели - PullRequest
0 голосов
/ 06 мая 2018

Я пытаюсь создать довольно простой вид ввода для веб-приложения 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.

1 Ответ

0 голосов
/ 06 мая 2018
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

В зависимости от типа запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...