【问题标题】:Is it possible for a Django template to test for existence of a row in a table without writing a custom tag/filter?Django 模板是否可以在不编写自定义标签/过滤器的情况下测试表中是否存在行?
【发布时间】:2010-08-30 20:18:07
【问题描述】:

我有以下型号:

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 的解决方案?

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    模板过滤器不是大枪:

    # 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 装饰器不会损害被装饰的功能。

    【讨论】:

    • s/login/logic/ 谢谢,迈克。发布后我已经自己写了,但是每当我考虑使用钩子时,我想确保我不会超越内置的解决方案。 (我会投票给你,但我显然太新了,不能这样做。)
    • 我会接受这个答案。我的问题是要确认这个大海捞针中没有任何针头,由于很难证明是否定的,我将把答案作为没有针头的充分证据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 2017-12-30
    • 2011-10-08
    • 2015-10-14
    • 2013-08-24
    • 2011-05-28
    相关资源
    最近更新 更多