在Django中使用UpdateView

时间:2018-01-27 17:37:38

标签: python django django-views

我可以使用以下代码成功添加评论:

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>

正如您所看到的,我尝试添加更新功能,但是当我点击更新链接并保存注释时,它会创建一个新实例而不是修改现有实例。

2 个答案:

答案 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。