如果我需要这样的网址,为评论创建get_absolute_url函数的最佳方法是什么:“/ article_url#comment-id”?
我的模特:
class Article(models.Model):
url = models.CharField()
def get_absolute_url(self):
return reverse('article-detail', args=[self.url])
class Comment(models.Model):
related_article = models.ForeignKey(Article)
我的变种:
1)非常简单,但在这种情况下,django将获取文章的所有字段,这对于主页上的“最新10条评论”这样的观点非常糟糕:
u = self.related_article.get_absolute_url()
return ''.join([u, '#comment-', str(self.pk)])
2)在这种情况下,函数将独立于Article类更改,但django将在第一个查询中获取pk,在第二个查询中获取url:
u = Article.objects.filter(pk=self.related_article_id) \
.only('pk') \
.get() \
.get_absolute_url()
return ''.join([u, '#comment-', str(self.pk)])
3)在这种情况下,字段'url'是硬编码的,但是django会在一个查询中获取pk和url:
u = Article.objects.filter(pk=self.related_article_id) \
.only('url') \
.get() \
.get_absolute_url()
return ''.join([u, '#comment-', str(self.pk)])
答案 0 :(得分:0)
我不确定您是否通过在文章模型中存储网址并提供 get_absolute_url 来获得更多收益,但是,您无需担心尝试明确支持您的网址中的锚标记;只需确保您在模板中的代码中正确设置了ID。
# views.py
def article_detail(request, article_id):
# Proper exception try/except handling excluded:
article = Article.objects.get(id=article_id)
article_comments = Comment.objects.filter(related_article_id=article_id)
return render_to_response('article_detail.html', {'article': article,
'article_comments': article_comments}
# article_detail.html
{% for article_comment in article_comments %}
<div id='comment-{{article_comment.id}}'>
{# Comment information here. #}
</div>
{% endfor %}
如果您有兴趣将评论摘要列表超链接回评论出现的原始文章,那么您最好也可以为评论模型定义 get_absolute_url 函数。
编辑:假设您在主页上显示了10条最新评论,但实际文章没有出现在其中:
# views.py
def main(request):
# Assumes timestamp exists for comments.
# Note: This query will get EXPENSIVE as the number of comments increases,
# and should be replaced with a better design for a production environment.
latest_article_comments = Comment.objects.all().order_by('creation_date')[:10]
render_to_response('main.html', {'latest_article_comments': latest_article_comments})
# main.html
{% for article_comment in article_comments %}
<a href="{% url 'article.views.article_detail' article_comment.related_article.id %}#comment-{{article_comment.id}}">{{article_comment.user_comment}}</a>
{% endfor %}