Python 仅适用于用户django的注释模型(1048,“;列';用户id';不能为空”;或没有用户填充)
我希望你身体好 我试图用一个表单字段(内容)为用户创建注释。我想让用户字段自动填入用户值 I.我从这个模型开始,但我得到一个错误(1048,“列'user\u id'不能为空”): models.pyPython 仅适用于用户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
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