【问题标题】:Comment model only for user django (1048, “Column 'user_id' cannot be null” or no user filled)仅适用于用户 django 的评论模型(1048,“列 'user_id' 不能为空”或没有用户填写)
【发布时间】:2020-11-22 03:09:29
【问题描述】:

希望你一切都好。

我正在尝试使用一个表单字段(内容)为用户创建评论。我想让用户字段自动填写用户值。

我。我从这个模型开始,但出现错误(1048,“Column 'user_id' cannot be null”): 模型.py

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name="comments")
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    content = models.TextField(max_length=160)
    publishing_date = models.DateField(auto_now_add=True)
     
    def __str__(self):
        return self.post.title

views.py

class PostDetail(generic.DetailView,FormMixin):
    model = Post
    context_object_name = 'post'
    template_name = 'post_detail.html'
    form_class = CreateCommentForm
    
    def get_context_data(self, **kwargs):
        context = super(PostDetail, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def form_valid(self, form):
        if form.is_valid():
            form.instance.post = self.object
            form.save()
            return super(PostDetail, self).form_valid(form)
        else:
            return super(PostDetail, self).form_invalid(form)

    def post(self,*args,**kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_valid(form)

    def get_success_url(self):
        return reverse('post_detail',kwargs={"slug":self.object.slug})

forms.py

class CreateCommentForm(forms.ModelForm):
    def __init__(self,*args,**kwargs):
        super(CreateCommentForm, self).__init__(*args,**kwargs)
        self.helper = FormHelper()
        self.helper.form_method="post"
        self.helper.layout = Layout(
            Field("content",css_class="form-control",style="margin-bottom:10px",rows="1"),
        )
        
        self.helper.add_input(Submit('submit','Comment',css_class="btn btn-sm",style="background-color: #0d6ec5;border-color: #0d6ec5;"))



    class Meta:
        model = Comment
        fields = [
            'content'
        ]

二。它可以在我的管理面板上工作,但不能在我的网站上工作(我收到此错误:(1048,“列'user_id'不能为空”))。 所以我决定改变我的模型:

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name="comments")
    user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE)
    content = models.TextField(max_length=160)
    publishing_date = models.DateField(auto_now_add=True)
     
    def __str__(self):
        return self.post.title

问题是,如果用户发表评论,内容还可以,但没有用户与评论相关。有人有想法吗?

【问题讨论】:

    标签: python django comments


    【解决方案1】:

    您需要指定.user 属性,可能对登录用户:

    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class PostDetail(LoginRequiredMixin, FormMixin, generic.DetailView):
        model = Post
        context_object_name = 'post'
        template_name = 'post_detail.html'
        form_class = CreateCommentForm
        
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            context['form'] = self.get_form()
            return context
    
        def form_valid(self, form):
            form.instance.post = self.object
            form.instance.user = self.request.user
            return super().form_valid(form)
    
        def post(self,*args,**kwargs):
            self.object = self.get_object()
            form = self.get_form()
            if form.is_valid():
                return self.form_valid(form)
            else:
                return self.form_valid(form)
    
        def get_success_url(self):
            return reverse('post_detail',kwargs={"slug":self.object.slug})

    注意:您可以将视图限制为基于类的视图,以向经过身份验证的用户提供 LoginRequiredMixin mixin [Django-doc].


    注意:通常使用settings.AUTH_USER_MODEL [Django-doc] 引用用户模型比直接使用User model [Django-doc] 更好。更多信息可以查看referencing the User model section of the documentation

    【讨论】:

    • 非常感谢您的建议。你的意思是这个模型? user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) 我尝试在我的视图中使用您的代码,但它使详细信息仅供用户使用。我用它来解决这个问题: {% if user.is_authenticated %} {% crispy form %} {% else %}

      已经是会员?登录后发表评论!

      {% endif %} {% for comment in post.cmets.all %}
    • @Louis:如果您将 models.ForeignKey(User, ...) 更改为 ``models.ForeignKey(settings.AUTH_USER_MODEL, ...), and the user model is User, that will not make any difference. You can drop the LoginRequired`非用户。但这有点“冒险”,因为现在未登录的用户可以“伪造”请求。在这种情况下,您可能希望使用不同的视图来发表评论。
    • 是的,我明白 :) 谢谢。当我发表评论时。我得到了他的错误名称“请求”未定义。有什么建议吗?对不起,我是 Django 的初学者
    • @Louis:抱歉打错了,是form.instance.user = self.request.user而不是... = request.user
    • 太棒了 :) 谢谢。我创建了一个与用户相关的用户配置文件,其图像如下: class UserProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE) image = models.ImageField(null=True,blank= True,default='user/user-128.png', upload_to='user/') ... img = Image.open(self.image.path) if img.height > 200 or img.width > 200: new_size = (200, 200) img.thumbnail(new_size) img.save(self.image.path) def __str__(self): return self.user.username
    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 2020-06-12
    • 2018-01-06
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多