Django模板是否可以在不编写自定义标记/过滤器的情况下测试表中是否存在行?

时间:2010-08-30 20:18:08

标签: django django-templates

我有以下型号:

class Post(models.Model):
    message = models.TextField()
    (etc.)

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    (etc.)

class PostFollow(models.Model):
    post = models.ForeignKey(Post, related_name='follower_set')
    follower = models.ForeignKey(UserProfile, related_name='follower_set')
    creation_date = models.DateTimeField(auto_now_add=True)
    an_arbitrary_score = models.IntegerField(default=0)
    (etc.)

    class Meta:
        unique_together = ('post', 'follower',)

在我的模板中,我想呈现帖子列表以及“关注”或“取消关注”链接,以便当前用户可以决定是否关注给定帖子。在我可以在Django模板中使用参数的世界中,我会做这样的事情:

{% for post in post_set %}
    <...stuff...>
    {% if post.user_is_following user %}unfollow{% else %}follow{% endif %}
    <...more stuff...>
{% endfor %}

但是,我做不到。我不能在任何这些模型上创建一个零参数,模板可调用的方法,因为它们都需要知道至少一个其他参数来回答该表中是否存在给定的PostFollow行的问题。

我很高兴写一个模板延伸,但在我拿出大枪之前,这是否适合这样做?或者是否有更多Djangoesque解决方案?

1 个答案:

答案 0 :(得分:5)

模板过滤器不是大枪:

# your_app/templatetags/following.py 

from django import template
register = template.Library()

@register.filter
def is_followed_by(post, user):
   return post.is_followed_by(user)  

然后:

{% load following %}
...
{% if post|is_followed_by:user %} ... {% endif %}

您还可以将所有逻辑放在模板过滤器中,删除'post.is_followed_by'方法并使用过滤器代替模型方法,就像任何其他函数一样,@ register.filter装饰器不会损坏装饰函数。