Получить ForeignKey из представлений перед сохранением в DJANGO

Как я могу получить внешний ключ из дочерних отношений формы, сохранить его одновременно с сохранением родительской информации на той же странице.

В настоящее время я работаю с двумя формами, родительской и дочерней. Логика страницы заключается в сохранении названия книги и названия содержащегося в ней курса.

Пример: Книга = "Изучите структуру данных и алгоритмы", Язык = "Питон"

модели.py

class Entity(models.Model):
    entity_name = models.CharField(max_length=250, blank=False)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='users')

    class Meta:
        verbose_name_plural = "Entities"

    def __str__(self):
        return self.entity_name

    def get_absolute_url(self):
        return reverse('snippets:password', kwargs = {'pk': self.pk})


class Password(models.Model):
    password_name = models.CharField(max_length=12, blank=False)
    entity = models.ForeignKey(Entity, on_delete=models.CASCADE, related_name='passwords')

    def __str__(self):
        return self.password_name

формы.py

from django import forms
from snippets.models import Entity, Password

class EntityForm(forms.ModelForm):
    class Meta:
        model = Entity
        fields = ('entity_name',)


class PasswordForm(forms.ModelForm):
    class Meta:
        model = Password
        fields = ('password_name',)

просмотры.py

def password_creation(request):
    if request.method == 'POST':
        form_one = EntityForm(request.POST)
        form_two = PasswordForm(request.POST)
        if form_one.is_valid():
            entity_form = form_one.save(commit=False)
            entity_form.owner = request.user
            entity_form.save()
            password_form = form_two.save(commit=False)
            # HERE : what is the right way to retrieve name from PK
            # owner is not part the Password table field therefore
            # need to be changed to 'password_name'or 'entity'
            # then, how to retrieve the field from the view??
            password_form.owner = request.user
            password_form.save()
            return redirect('snippets:entity')

    else:
        form_one = EntityForm()
        form_two = PasswordForm() 


    context = {
        'form_one':form_one,
        'form_two':form_two,
    }

    return render(request, 'snippets/create-password.html', context)

Я пробовал коды выше. Проблема в том, что Django сохраняет имя «Книги», но не имя «Языка» в базе данных. Система также ломается и возвращает это сообщение: NOT NULL constraint failed: snippets_password.entity_id.

Любая помощь приветствуется.

Ошибка трассировки

Traceback (most recent call last):
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/core/handlers/base.py", line 128, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/core/handlers/base.py", line 126, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/password_change/snippets/views.py", line 67, in password_creation
    password_form.save()
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/models/base.py", line 729, in save
    force_update=force_update, update_fields=update_fields)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/models/base.py", line 759, in save_base
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/models/base.py", line 842, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/models/base.py", line 880, in _do_insert
    using=using, raw=raw)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/models/query.py", line 1125, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/models/sql/compiler.py", line 1280, in execute_sql
    cursor.execute(sql, params)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/backends/utils.py", line 85, in _execute
    return self.cursor.execute(sql, params)
  File "/Users/macadmin/Documents/Django_wapps/password_change_test/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py", line 303, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: snippets_password.entity_id

вы не показываете модель с помощью snippets_password или способа доступа к ней. покажи полную трассировку пожалуйста

HenryM 27.05.2019 19:52

Я обновил полную трассировку выше. Я считаю, что проблема заключается в правильном извлечении имени из отношения PK. Пожалуйста, посмотрите выше, где говорится, что # HERE : what is the right way to retrieve name from PK language_form.owner = request.user владелец (поэтому существует в языковой таблице) должен быть изменен на request."book", тогда правильный способ получить поле. это то, с чем я сейчас борюсь.

Curtis Banks 27.05.2019 20:11

Вот где он терпит неудачу: File "/Users/macadmin/Documents/Django_wapps/password_change_test‌​/password_change/sni‌​ppets/views.py", line 67, in password_creation password_form.save()

HenryM 27.05.2019 20:43

Трассировка совсем не соответствует вашему коду. Это показывает, что он не работает при вызове password_form.save(). У вас нет ничего, что называется в коде, который вы разместили. Пожалуйста, покажите фактический код ошибки, иначе мы не сможем вам помочь.

Daniel Roseman 27.05.2019 21:15

Даниил, я все обновил. У вас есть идеи, как это решить ?? вот что я получаю от терминала Exception Value: NOT NULL constraint failed: snippets_password.entity_id. Пожалуйста, прочитайте мои личные комментарии в представлении выше

Curtis Banks 27.05.2019 22:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
172
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш диагноз совершенно неверен. У пароля нет поля владельца или какой-либо связи с пользователем. Его связь с сущностью, и в ошибке четко указано, что это сущность или что-то отсутствует. Итак, вам просто нужно назначить Entity, которую вы только что создали:

    if form_one.is_valid() and form_two.is_valid():
        entity = form_one.save(commit=False)
        entity.owner = request.user
        entity.save()
        password = form_two.save(commit=False)
        password.entity = entity
        password.save()

Обратите внимание, я добавил проверку на то, что form_two действителен, а также переименовал объекты: результатом вызова form.save является не форма, а экземпляр модели.

"ГЕНИЙ". Большое спасибо.

Curtis Banks 27.05.2019 22:40

Другие вопросы по теме