0

如果我需要这样的 url:“/article_url#comment-id”,为 Comment 创建 get_absolute_url 函数的最佳方法是什么?

我的模型:

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)])
4

1 回答 1

0

我不确定通过将url存储在 Article 模型中并提供get_absolute_url是否获得了很多好处,但是,您不必担心尝试在 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 %}

如果您有兴趣将评论摘要列表超链接回出现评论的原始文章,那么您最好也为 Comment 模型定义一个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 %}
于 2013-08-18T16:04:54.340 回答