我可以使用以下代码成功添加评论:
views.py:
class CommentCreate(CreateView):
model = Comment
fields = ['body']
def form_valid(self, form):
film = Film.objects.get(pk=self.kwargs['film_id'])
form.instance.user = self.request.user
form.instance.film = film
return super(CommentCreate, self).form_valid(form)
class CommentUpdate(UpdateView):
model = Comment
fields = ['body']
def form_valid(self, form):
film = Film.objects.get(pk=self.kwargs['film_id'])
comment = Film.objects.get(pk=self.kwargs['comment_id'])
form.instance.user = self.request.user
form.instance.film = film
form.instance.comment = comment
return super(CommentUpdate, self).form_valid(form)
urls.py:
path('<int:film_id>/comment/', views.CommentCreate.as_view(), name='add_comment'),
path('<int:film_id>/comment/', views.CommentUpdate.as_view(), name='update_comment'),
models.py:
class Comment(models.Model):
# user = models.ForeignKey(User, on_delete=models.CASCADE)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
film = models.ForeignKey(Film, on_delete=models.CASCADE)
body = models.CharField(max_length=200)
def get_absolute_url(self):
return reverse('films:detail', kwargs={'pk': self.film.pk})
html文件中的链接:
<a href="{% url 'films:add_comment' film_id=film.id %}">Leave a comment</a>
<a href="{% url 'films:update_comment' film_id=film.id %}">Update</a>
正如您所看到的,我尝试添加更新功能,但是当我点击更新链接并保存注释时,它会创建一个新实例而不是修改现有实例。
答案 0 :(得分:1)
您创建和更新的路径是相同的。如果您没有为评论传递ID,则您的代码无法知道应该更新哪条评论(电影可能有多条评论。) 因此,请将更新路径更改为:
path('<int:film_id>/comment/<int:comment_id>/', views.CommentUpdate.as_view(), name='update_comment'),
和你的主播
<a href="{% url 'films:update_comment' film_id=film.id comment_id=comment.id %}">Update</a>
(每部电影只有一个创建评论按钮,但对于该电影中的每个评论都有一个单独的更新按钮,因此更新按钮会绑定到评论,并且应该知道评论ID。)< / p>
答案 1 :(得分:1)
您已经为更新和创建创建了相同的确切路径,并且未在评论更新路径中包含标识符。 Django路径匹配匹配的第一个路径,即创建路径。你需要独特的路线。
path('<int:film_id>/comment/<int:comment_id>/', views.CommentUpdate.as_view(), name='update_comment'),
<a href="{% url 'films:update_comment' film_id=film.id comment_id=comment.id %}">Update</a>
这里的href可能没有正确定义,因为我不知道你的评论结构是什么样的,但是你需要传递你正在更新的评论的id。