Сбой ограничения IntegrityError NOT NULL: - при проверке формы отсутствует идентификатор пользователя (первичный ключ другой модели) - PullRequest
0 голосов
/ 13 апреля 2020

Предыдущее название: Невозможно импортировать 'misaka' - Django

Я следую учебному пособию о том, как построить социальную сеть.

Я сталкиваюсь с эта ошибка:

Ошибка IntegrityError в / posts / new / NOT NULL не выполнена: posts_post.user_id

Полный возврат (обратите внимание на строки, выделенные жирным шрифтом):

Вышеприведенное исключение (ограничение NOT NULL не выполнено: posts_post.user_id) было прямой причиной следующего исключения: C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ core \ handlers \ exception.py в внутренний ответ = get_response (запрос)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ core \ handlers \ base.py in _get_response response = self.process_exception_by_middleware (например, запрос)… ▶ Локальный vars C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ core \ handlers \ base.py в _get_response response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ views \ generic \ base.py в представлении возвращает self.dispatch (запрос, * аргументы, ** kwargs)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ contrib \ auth \ mixins.py при отправке возвращает super (). dispatch (запрос, * аргументы, ** kwargs)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site -packages \ django \ views \ generic \ base.py в обработчике возврата отправки (запрос, * args, ** kwargs)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ views \ generic \ edit.py в post возвращают super (). post (запрос, * args, ** kwargs)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ views \ generic \ edit.py в возвращаемом сообщении self.form_valid (форма)…

▶ Локальные переменные C: \ Users \ Tommaso \ Django rest framework \ Udemy Django \ simplesocial \ posts \ views.py в form_valid return super (). form_valid (форма)

▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-pa ckages \ django \ views \ generic \ edit.py в form_valid self.object = form.save ()… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ forms \ models.py в моделях save self.instance.save ()…

▶ Локальные переменные C: \ Users \ Tommaso \ Django rest framework \ Udemy Django \ simplesocial \ posts \ models.py в save super () .save (* args, ** kwargs)

▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ models \ base.py в save force_update = force_update, update_fields = update_fields)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ models \ base.py в save_base force_update, используя, update_fields,… ▶ Локальные переменные C : \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ models \ base.py в _save_table result = self._do_insert (cls._base_manager, использование, поля, update_pk, raw)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ models \ base.py в _do_insert using = using , raw = raw)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ models \ manager.py в manager_method возвращают getattr (self.get_queryset (), name) (* args, ** kwargs)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ models \ query.py в _insert возвращает query.get_compiler (using = using) .execute_ sql (return_id )… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ models \ sql \ compiler.py в execute_sql cursor.execute (sql, params)… ▶ Локальные переменные C : \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ backends \ utils.py при выполнении return super (). Execute (sql, params)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ backends \ utils.py в исполнении вернуть self._execute_with_wrappers (sql, params, many = False, executor = self._execute)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ backends \ utils.py в _execute_with_wrappers возвращает исполнителя (sql, params, many, context)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ backends \ utils.py в _execute возвращают self.cursor.execute (sql, params)… ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ utils.py в выход поднять dj_exc_value.with_traceback (traceback) из exc_value … ▶ Локальные переменные C: \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ backends \ utils.py в _execute возвращают self.cursor.execute (sql, params)… ▶ Локальные переменные C : \ Applicazioni_Tommaso \ Phyton \ lib \ site-packages \ django \ db \ backends \ sqlite3 \ base.py при выполнении возвращают Database.Cursor.execute (self, query, params)… ▶ Локальные переменные

Строки жирным шрифтом указывают на эти две части код:

1: в my_project \ posts \ views.py в form_valid:

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object = self.request.user
    self.object.save()
    return super().form_valid(form) #<--highligted line 

2: в my_project \ posts \ models.py в save

def save(self, *args, **kwargs):
    self.message_html = m.html(self.message)
    super().save(*args, **kwargs) #<--highligted line 

Эти функции запускаются, когда пользователь публикует новое сообщение в группе социальной сети.

Я использую VScode, поэтому заметил, что мой код не распознает misaka , установлен через pip и импортирован следующим образом:

import misaka as m

Ошибка импорта Pylint: невозможно импортировать 'misaka'

Я прочитал документацию по Misaka, но не могу понять что не так.
обратите внимание, что я использую Misaka v. 2.1.0, которую, по-видимому, не нужно устанавливать в INSTALLED_APPS в настройках.

Есть мысли?

Поскольку было предложено, чтобы я я пытаюсь создать объект модели Post в базу данных без установки внешнего ключа пользователя, здесь вы можете увидеть мой my_project / posts / model.py:

from django.db import models
from django.urls import reverse #vho corretto io, ersione di django cambiata
from django.conf import settings

import misaka as m

from groups.models import Group

from django.contrib.auth import get_user_model
User = get_user_model()

class Post(models.Model):
    user = models.ForeignKey(User, related_name="posts", on_delete=models.CASCADE)

    created_at = models.DateTimeField(auto_now=True)
    message = models.TextField()
    message_html = models.TextField(editable=False)

    group = models.ForeignKey(Group, related_name="posts", null=True, blank=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.message

    def save(self, *args, **kwargs):
        self.message_html = m.html(self.message)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('posts:single', kwargs={'username':self.user.username, 'pk':self.pk})

    class Meta:
            ordering = ['-created_at']
            unique_together = ['user', 'message'] 

Ответы [ 3 ]

1 голос
/ 13 апреля 2020

Вы пытаетесь вставить объект модели Post в базу данных без установки внешнего ключа пользователя.

Вы должны сначала установить его для объекта пользователя, присоединенного к запросу.

def form_valid(self, form):
    form.instance.created_by = self.request.user
    return super().form_valid(form)

Чек Django Документация

0 голосов
/ 13 апреля 2020

add: self.object.user = self.request.user И add: self.object () не self.object

def form_valid (self, form): self.object = form.save ( commit = False) self.object.user = self.request.user self.object.save () return super (). form_valid (form)

0 голосов
/ 13 апреля 2020

Как подсказывает @ ebram-shehata, код пытался вставить объект модели Post в базу данных без установки внешнего ключа пользователя, и это потому, что в методе form_valid(self, form) я неправильно набрал строку.

Я заменил

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object = self.request.user
    self.object.save()
    return super().form_valid(form)

на:

def form_valid(self, form):
    self.object = form.save(commit=False)
    self.object.user = self.request.user
    self.object.save()
    return super().form_valid(form)

и теперь все работает отлично!

...