Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 仅适用于用户django的注释模型(1048,“;列';用户id';不能为空”;或没有用户填充)_Python_Django_Comments - Fatal编程技术网

Python 仅适用于用户django的注释模型(1048,“;列';用户id';不能为空”;或没有用户填充)

Python 仅适用于用户django的注释模型(1048,“;列';用户id';不能为空”;或没有用户填充),python,django,comments,Python,Django,Comments,我希望你身体好 我试图用一个表单字段(内容)为用户创建注释。我想让用户字段自动填入用户值 I.我从这个模型开始,但我得到一个错误(1048,“列'user\u id'不能为空”): models.py class Comment(models.Model): post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name="comments") user = models.ForeignK

我希望你身体好

我试图用一个表单字段(内容)为用户创建注释。我想让用户字段自动填入用户值

I.我从这个模型开始,但我得到一个错误(1048,“列'user\u id'不能为空”): models.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'不能为null”))。 因此,我决定通过以下方式改变我的模型:

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

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

您需要指定
.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})
来自django.contrib.auth.mixins导入登录所需的mixin
类PostDetail(LoginRequiredMixin、FormMixin、generic.DetailView):
型号=员额
上下文\对象\名称='post'
模板名称='post\u detail.html'
form_class=CreateCommentForm
def获取上下文数据(自身,**kwargs):
context=super()。获取上下文数据(**kwargs)
上下文['form']=self.get_form()
返回上下文
def表单_有效(自身、表单):
form.instance.post=self.object
form.instance.user=self.request.user
返回super().form_有效(form)
def post(自我,*args,**kwargs):
self.object=self.get_object()
form=self.get\u form()
如果form.is_有效():
返回self.form\u有效(form)
其他:
返回self.form\u有效(form)
def get_success_url(自我):
返回反向('post_detail',kwargs={“slug”:self.object.slug})

注意:您可以将基于类的视图限制为具有


注意:通常最好使用来引用用户模型,而不是直接使用。有关更多信息,请参见


非常感谢你的建议。你是说这个模型?user=models.ForeignKey(settings.AUTH\u user\u MODEL,on\u delete=models.CASCADE)我试图在视图中使用您的代码,但它使详细信息仅对用户可用。我用它来解决这个问题:{%if user.u是否经过身份验证%}{%crispy form%}{%else%}已经是成员了吗?登录发表评论

{%endif%}{%for comment in post.comments.all%}@Louis:如果您将
models.ForeignKey(User,…)
更改为``models.ForeignKey(settings.AUTH_User_MODEL,…)
,并且用户模型为
User
,则不会有任何区别。如果您想让非用户可以访问该表单,则可以删除
LoginRequired`。但这有点“风险”,因为现在未登录的用户可以“伪造”请求。在这种情况下,您可能需要使用不同的视图来发布评论。是的,我理解:)谢谢。当我发表评论的时候。我得到他的错误名称“请求”未定义。有什么建议吗?对不起,我是个初学者Django@Louis:很抱歉输入错误,它是
form.instance.user=self.request.user
而不是
…=请求。用户
。惊人:)谢谢。我创建了一个与用户相关的用户配置文件,其图像如下:class UserProfile(models.Model):User=models.OneToOneField(settings.AUTH\u User\u Model,on\u delete=models.CASCADE)image=models.ImageField(null=True,blank=True,default='User/User-128.png',upload\u to='User/')。。。如果img.height>200或img.width>200,则img=Image.open(self.Image.path):new\u size=(200200)img.缩略图(new\u size)img.save(self.Image.path)def\u str\u(self):返回self.user.username