我可以制作' get_absolute_url'返回一个相关的模态DetailView?

时间:2017-10-04 13:27:44

标签: python django

所以我有一个Django项目,其中包括名为' Artist'的模型。我创建了详细视图,显示了与此模型相关的所有变量(是的!)现在我想为每位艺术家添加评论功能,因此我创建了一个名为“ArtistComment&#39”的模型;:

class ArtistComment(models.Model):
     author = models.ForeignKey(User, default=1)
     artist = models.ForeignKey(Artist, on_delete=models.CASCADE, related_name='artistcomment')
     message = models.TextField(max_length=1000)
     created_at = models.DateTimeField(auto_now_add=True)
     approved = models.BooleanField(default=True)

     def approve(self):
         self.approved_comment = True
         self.save()

     def get_absolute_url(self):
         return reverse('events:artistdetail', kwargs={'pk': self.pk})

     def __str__(self):
         return self.created_at.strftime('%H: %M - %d %b')

我的urls.py看起来像这样:

    url(r'^artist-(?P<pk>[0-9]+)/$', login_required(views.ArtistDetailView.as_view()), name='artistdetail'),
    url(r'^artistcomment/add/$', login_required(views.ArtistCommentCreate.as_view()), name='artistcomment-add'),

我的ArtistComment CreateView如下所示:

class ArtistCommentCreate(CreateView):
    model = ArtistComment
    fields = ['artist', 'message',]

    def form_valid(self, form, **args):
        form.instance.author = self.request.user
        self.object = form.save()
        return super(ArtistCommentCreate, self).form_valid(form)

最后,ArtistDetail视图中的URL如下所示:

<a data-toggle="modal" data-target="#artistcommentModal" href="{% url 'events:artistcomment-add' %}">Add A New Comment</a></p>

(我使用模态div来弹出表单)

我的问题是,当我提交新评论时,“get_absolute_url&#39;从ArtistComment返回主键,而不是与ArtistComment相关的艺术家。如何将表单重定向到刚刚提交评论的艺术家页面?

我还考虑在CreateView中添加success_url,但是我遇到了类似的问题。

1 个答案:

答案 0 :(得分:0)

要访问相关艺术家的主键,您可以使用self.artist_idself.artist.pk代替self.pk

 def get_absolute_url(self):
     return reverse('events:artistdetail', kwargs={'pk': self.artist_id})

但是,为get_absolute_url ArtistComment返回不同模型的网址可能不是一个好主意。另一种方法是在视图中覆盖get_success_url

class ArtistCommentCreate(CreateView):
    def get_success_url(self):
        return reverse('events:artistdetail', kwargs={'pk': self.object.artist_id})

请注意,CreateView form_valid()方法会在您致电super()时保存表单,因此您可以删除self.object = form.save()行。

    def form_valid(self, form, **args):
        form.instance.author = self.request.user
        return super(ArtistCommentCreate, self).form_valid(form)

您可能希望使用LoginRequiredMixin来阻止匿名用户创建评论。