Как создать специальный шаблонный тег if с Django? - PullRequest
3 голосов
/ 10 октября 2009

Моя проблема - условие 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 ]

11 голосов
/ 10 октября 2009

Самый простой способ - создать фильтр.

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

и в шаблоне:

{% if restaurant|is_favourite_of:user %}
2 голосов
/ 10 октября 2009

Может быть, я мог бы использовать тег включения .

Создайте такой тег:

{% 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 голосов
/ 11 октября 2009

Когда ничего не помогает, вы можете использовать тег {% expr what%}, чтобы вычислить значение и вставить его в переменную, которую вы можете использовать в своем шаблоне. Я не позволяю дизайнерам знать об этом, но иногда это единственное, что не стоит стоять у вас на голове и ... ну, вы знаете.

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

...