如何在Django中创建特定的if条件模板标签?

3 投票
3 回答
1454 浏览
提问于 2025-04-15 14:58

我的问题是关于一个if条件的。

我想要实现类似的功能,但不知道该怎么做。

{% if restaurant.is_favorite_of(user) %}
     <img src="{{MEDIA_URL}}images/favorite_on.png" alt="This restaurant is one of your favorite (Click to undo)" />
{% else %}
     <img src="{{MEDIA_URL}}images/favorite_off.png" alt="This restaurant is not one of your favorite (Click to add to your favorite)" />
{% endif %}

在我的收藏管理器中,我创建了:

def is_favorite(self, user, content_object):
    """
    This method returns :
       - True if content_object is favorite of user
       - False if not
    >>> user = User.objects.get(username="alice")
    >>> fav_user = User.objects.get(username="bob")
    >>> fav1 = Favorite.create_favorite(user, fav_user)
    >>> Favorite.objects.is_favorite(user, fav_user)
    True
    >>> Favorite.objects.is_favorite(user, user)
    False
    >>> Favorite.objects.all().delete()

    Above if we test if bob is favorite of alice it is true.
    But alice is not favorite of alice.
    """
    ct = ContentType.objects.get_for_model(type(content_object))
    try:
        self.filter(user=user).filter(content_type = ct).get(object_id = content_object.id)
        return True
    except Favorite.DoesNotExist:
        return False

因为在Django模板中没有办法这样做,所以我可以做一个模板标签来实现这个功能:

{% is_favorite user resto %}
     <img src="{{MEDIA_URL}}images/favorite_on.png" alt="This restaurant is one of your favorite (Click to undo)" />
{% else %}
     <img src="{{MEDIA_URL}}images/favorite_off.png" alt="This restaurant is not one of your favorite (Click to add to your favorite)" />
{% endif %}

但是该怎么做呢?你们有没有更好的主意?

3 个回答

0

当其他方法都不奏效时,你可以使用{% expr whatever %}这个标签来计算一个值,并把它放进一个变量里,这样你就可以在你的模板中使用它。我通常不让设计师知道这个方法,但有时候这是唯一有效的办法,除了倒立之外……你懂的。

可以查看 http://www.djangosnippets.org/snippets/9/

2

也许我可以使用包含标签

创建一个这样的标签:

{% show_favorite_img user restaurant %}

templatetags/user_extra.py :

@register.inclusion_tag('users/favorites.html')
def show_favorite_img(user, restaurant):
    return {'is_favorite': Favorite.objects.is_favorite(user, restaurant)}
11

最简单的方法就是创建一个过滤器。

@register.filter
def is_favourite_of(object, user):
    return Favourite.objects.is_favourite(user, object)

然后在模板里使用它:

{% if restaurant|is_favourite_of:user %}

撰写回答