2010-01-12 5 views
2

j'ai un modèle utilisateur, un modèle de l'article, et un modèle possession pour stocker des données sur un utilisateur possédant un élément. Lorsqu'un utilisateur est connecté et l'affichage d'un élément, je veux afficher un «ajouter à mes articles de bouton, à moins que l'utilisateur a déjà l'élément.déterminer si un utilisateur est associé à un objet à travers une autre classe dans un modèle de django

Je tentais ce code dans le modèle:

{% if not user.possession_set.filter(item=item.id) %}  
<input type='submit' value='add to my items' /> 
{% endif %} 

élément est le nom de clé étrangère pour l'objet de l'article dans mon modèle de possession et item.id est la clé primaire l'élément affiché à l'utilisateur

mais je reçois cette erreur:

Could not parse the remainder: '(item=item.id)' 

Je pense que je ne peux pas utiliser la fonction .filter() puisque c'est la base de données pour effectuer des requêtes? J'ai trouvé les filtres de modèle de django, comme celui-ci: http://docs.djangoproject.com/en/1.1/ref/templates/builtins/#get-digit mais il n'y a pas qui peut être combiné pour filtrer une certaine valeur de l'élément. Il semble que j'aurais toutes les informations dans le modèle pour ce faire, puisque je suis en train de l'utilisateur et il est possession_set, ce qui devrait avoir le champ d'élément pour chaque possession, donc je pense qu'il est juste une chose de syntaxe?

Merci pour l'aide!

+0

Bonne question, je me demandais aussi ce que la manière canonique de le faire est en django, mais il semble un peu alambiquée. – Alper

Répondre

2

Vous pouvez écrire un filtre de modèle personnalisé pour cela.

def owns(user, id): 
    return not user.possession_set.filter(item=id) 

Ensuite, dans votre modèle:

{% load mystuff %} 
{% if user|owns:item.id %} 

Vérifiez les docs Django à http://docs.djangoproject.com/en/1.1/howto/custom-template-tags/ pour plus d'informations. Je ne sais pas si passer le item.id comme argument de filtre fonctionnera, cependant.

+0

génial! ça a bien marché! Merci! – gohnjanotis

1

Vous ne pouvez pas utiliser de telles expressions compliquées dans le modèle, uniquement dans la vue. Calculez les informations, si l'utilisateur peut avoir ce bouton dans la vue et transmettre une seule valeur True ou False au modèle. Par exemple:

en vue

allow_addition = not user.possession_set.filter(item=item.id) 

et modèle:

{% if allow_addition %} 
    <input type='submit' value='add to my items' /> 
{% endif %} 
+0

Yup! Cela devrait fonctionner. Je me demandais ce que serait une bonne mise en œuvre s'il y avait beaucoup d'éléments que vous vouliez faire avec? Cela rend un peu plus difficile. –

Questions connexes