所以我有一个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,但是我遇到了类似的问题。
答案 0 :(得分:0)
要访问相关艺术家的主键,您可以使用self.artist_id
或self.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
来阻止匿名用户创建评论。