1

上一个标题:无法导入 'misaka' - Django

我正在关注有关如何建立社交网络的教程。

我遇到了这个错误:

/posts/new/ NOT NULL 约束处​​的 IntegrityError 失败:posts_post.user_id

完整的回溯(请注意粗体字):

上述异常(NOT NULL 约束失败:posts_post.user_id)是以下异常的直接原因:C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\handlers\exception.py in inner response = get_response( request) … ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\core\handlers\base.py in _get_response response = self.process_exception_by_middleware(e, request) … ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton \lib\site-packages\django\core\handlers\base.py in _get_response response = Wrapped_callback(request, *callback_args, **callback_kwargs) … ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\ views\generic\base.py in view return self.dispatch(request, *args, **kwargs) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\contrib\auth\mixins.py 在 dispatch return super().dispatch(request, *args, **kwargs) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib \site-packages\django\views\generic\base.py 在 dispatch return handler(request, *args, **kwargs) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\views\generic \edit.py in post return super().post(request, *args, **kwargs) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\views\generic\edit.py in post return self.form_valid(form) …</p>**kwargs) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\views\generic\edit.py 在 post return super().post(request, *args, **kwargs) ... ▶本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\views\generic\edit.py 在 post return self.form_valid(form) ...</p>**kwargs) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\views\generic\edit.py 在 post return super().post(request, *args, **kwargs) ... ▶本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\views\generic\edit.py 在 post return self.form_valid(form) ...</p>

▶ 本地变量 C:\Users\Tommaso\Django rest framework\Udemy Django\simplesocial\posts\views.py in form_valid return super().form_valid(form) …</p>

▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\views\generic\edit.py in form_valid self.object = form.save() … ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site -packages\django\forms\models.py 在保存 self.instance.save() ...</p>

▶ 本地变量 C:\Users\Tommaso\Django rest framework\Udemy Django\simplesocial\posts\models.py in save super().save(*args, **kwargs) …</p>

▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\models\base.py 保存在 force_update=force_update, update_fields=update_fields) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site- packages\django\db\models\base.py in save_base force_update, using, update_fields, … ▶ Local vars C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\models\base.py in _save_table result = self ._do_insert(cls._base_manager, using, fields, update_pk, raw) ... ▶ _do_insert using=using, raw=raw 中的本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\models\base.py ) … ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\models\manager.py in manager_method return getattr(self.get_queryset(), name)(*args,**kwargs) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\models\query.py in _insert return 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 in execute return super().execute(sql, params) … ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py in执行 return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) ... ▶ _execute_with_wrappers 中的本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py 返回执行程序(sql,参数,很多,context) ... ▶ 本地变量 C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py in _execute return self.cursor.execute(sql, params) ... ▶ 本地变量 C:\Applicazioni_Tommaso\ Phyton\lib\site-packages\django\db\utils.py 在exit raise dj_exc_value.with_traceback(traceback) from exc_value … ▶ Local vars C:\Applicazioni_Tommaso\Phyton\lib\site-packages\django\db\backends\utils.py in _execute return 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\pos​​ts\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\pos​​ts\models.py中保存

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'] 
4

3 回答 3

1

您试图在不设置 User 外键的情况下将 Post 模型对象插入数据库。

您应该首先将其设置为附加到请求的用户对象。

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

检查Django 文档

于 2020-04-13T10:42:08.660 回答
1

解决了:

正如@ebram-shehata 所建议的那样,代码试图在不设置 User 外键的情况下将 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)

现在它工作正常!

于 2020-04-13T15:54:46.233 回答
0

添加 :

self.object.user = self.request.user 

并替换self.objectself.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)
于 2020-04-13T18:31:00.590 回答