Python 我可以让“get_absolute_url”返回相关的模式详细视图吗?

Python 我可以让“get_absolute_url”返回相关的模式详细视图吗?,python,django,Python,Django,因此,我有一个Django项目,其中包括一个名为“艺术家”的模型。我已经创建了详细视图,显示了与此模型相关的所有变量耶!现在我想为每个艺术家添加一个评论功能,因此我创建了一个名为“ArtistComment”的模型: class ArtistComment(models.Model): author = models.ForeignKey(User, default=1) artist = models.ForeignKey(Artist, on_delete=models.

因此,我有一个Django项目,其中包括一个名为“艺术家”的模型。我已经创建了详细视图,显示了与此模型相关的所有变量耶!现在我想为每个艺术家添加一个评论功能,因此我创建了一个名为“ArtistComment”的模型:

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')
My 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'),
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)
<a data-toggle="modal" data-target="#artistcommentModal" href="{% url 'events:artistcomment-add' %}">Add A New Comment</a></p>
最后,ArtistDetail视图中的URL如下所示:

    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'),
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)
<a data-toggle="modal" data-target="#artistcommentModal" href="{% url 'events:artistcomment-add' %}">Add A New Comment</a></p>
我正在使用一个模态div来创建表单弹出窗口

我的问题是,当我提交新评论时,“get_absolute_url”会从ArtistComment返回主键,而不是ArtistComment所涉及的艺术家。我如何使表单重定向到它刚刚提交评论的艺术家页面


我还考虑过向CreateView添加一个success\uURL,但我遇到了类似的问题

要访问相关艺术家的主键,可以使用self.artist_id或self.artist.pk而不是self.pk

但是,让ArtistComment的get_absolute_url返回不同模型的url可能不是一个好主意。另一种方法是替代视图中的get_success_url

class ArtistCommentCreate(CreateView):
    def get_success_url(self):
        return reverse('events:artistdetail', kwargs={'pk': self.object.artist_id})
请注意,当您调用super时,CreateView的form\u valid方法将负责保存表单,因此您可以删除self.object=form.save行


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

这工作做得很好!特别感谢你给我打电话给super的提示