Django:当有人留下评论时,如何填充其他模型字段



我试图让任何人在博客上发表评论,但我的模型中还有其他字段需要获得表单本身不需要的信息。我已经尝试将它添加到form_valid方法中,但在提交表单时没有调用该方法。感谢提供的任何帮助

视图.py

class CommentView(CreateView):
template_name = "core/index.html"
model = Comment
form_class = CommentForm
def get_success_url(self):
return reverse_lazy("core:home")
def form_valid(self, form):
print("form is valid")
form.save()
return super().form_valid(form)

forms.py

class CommentForm(ModelForm):
class Meta:
model = Comment
fields = [
"text",
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["text"].widget.attrs.update(
{"class": "form-control", "placeholder": "Enter Your Comment Here",}
)

型号.py

class Comment(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(
BlogPost, on_delete=models.CASCADE, related_name="comments"
)
text = models.TextField(max_length=255, default="")
date_posted = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"({self.author})'s comment on ({self.post.title})"

urls.py

app_name = "blog"
urlpatterns = [
path("post/<int:pk>/", BlogPostDetailView.as_view(), name="detail"),
path("post/category/<int:pk>/", CategoryListView.as_view(), name="category"),
path("post/comment/<int:pk>/", CommentView.as_view(), name="comment"),
]

您可以这样尝试:

class CommentView(CreateView):
template_name = "core/index.html"
model = Comment
form_class = CommentForm
def get_success_url(self):
return reverse_lazy("core:home")
def form_valid(self, form):
form.instance.post_id = self.kwargs['pk']
form.instance.author = self.request.user
return super().form_valid(form)

这里我假设您通过url的pk属性传递Post(主键(的值,并且form.instance具有新的(尚未保存到DB(Comment对象。然后,我将附加request.user(当前用户(的值和该实例的post-id。

最新更新