2009-10-10 8 views
3

Mon problème est une condition if.Comment créer une condition particulière if condition avec Django?

Je voudrais quelque chose comme ça, mais je ne sais pas comment le faire.

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

Dans le gestionnaire favori, j'ai créé:

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 

Parce que dans les modèles Django, il n'y a aucun moyen de le faire aime ça, je pouvais faire un templatetag qui agissent comme ça:

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

Mais comment le faire? Avez-vous une meilleure idée?

Répondre

11

plus simple est de créer un filtre.

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

et dans le modèle:

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

Thats bon, je ne savais pas que nous pourrions utiliser le filtre dans un état si. – Natim

2

Peut-être que je pourrais utiliser the inclusion tag.

Créer une étiquette comme ça:

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

Quand tout le reste échoue, vous pouvez utiliser le {% expr quelle que soit%} tag pour calculer une valeur et le coller dans une variable que vous pouvez utiliser dans votre modèle. Je ne laisse pas les designers le savoir, mais parfois c'est la seule chose qui ne marche pas sur votre tête et ... eh bien, vous savez.

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

+0

Je préférerais également ne pas utiliser cette "étiquette spéciale". – Natim

+0

Je suis complètement d'accord. Comme je l'ai dit il y a quelques mois dans un commentaire, le système de gabarits prêts à l'emploi de Django manque à plusieurs égards. La revendication est que cela empêche les concepteurs de faire de mauvaises choses, mais mon expérience est que quelque chose de plus compliqué qu'un simple if/else finit par être fait par les programmeurs de toute façon. Cela signifie que les expressions triviales comme celle-ci impliquent la création de beaucoup de tags personnalisés. Faire un ou deux n'est pas un gros problème, après quoi il commence à vieillir très rapidement. –

Questions connexes