2009-10-10 74 views
3

我的問題是如果條件。如何用Django創建特定的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模板沒有做它喜歡這種方式,我能做到這一點像一個templatetag:

{% 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 %} 

但是怎麼做呢? 你有更好的主意嗎?

回答

11

最簡單的方法是創建一個過濾器。

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

,並在模板:

{% if restaurant|is_favourite_of:user %} 
+0

那好,我不知道,我們可以在一個if條件使用的過濾器。 – Natim 2009-10-10 15:16:09

2

也許我可以使用the inclusion tag

創建一個標籤這樣的:

{% 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)} 
0

當一切都失敗了,你可以使用{%EXPR任何%}標籤來計算價值,把它貼在你可以使用一個變量您模板。我不讓設計師知道它,但有時它是唯一不能站在你頭上的......而且,你知道。

http://www.djangosnippets.org/snippets/9/

+0

我也不希望使用這個「spécial標籤」。 – Natim 2009-10-11 09:31:01

+0

我完全同意。正如我在幾個月前的評論中所說的那樣,Django的開箱即用模板系統在幾個方面都缺乏。聲明是這樣可以讓設計人員不會做壞事,但我的經驗是,任何比簡單的if/else更復雜的事情最終都會由程序員完成。這意味着像這樣的微不足道的表達式需要創建大量的自定義標籤。做一兩件事沒什麼大不了的,之後就會很快變老。 – 2009-10-11 17:51:52