2010-01-06 1 views
0

J'utilise des tags de modèle tiers dans mon application Django (maintenue ailleurs) qui renvoient un nom d'utilisateur sous la forme d'une chaîne accessible dans mes modèles comme ce.Balise de modèle Django personnalisée pour rechercher un nom d'utilisateur de chaîne et la renvoyer en tant qu'objet utilisateur

{% for user in gr.user.foll.list %} 

{{user}} 

Le problème est parce que {{user}} est retourné comme une chaîne - je dois convertir en un objet utilisateur Django, si elle existe dans le Django DB, ou définir un varible non enregistré si je peux pas faire des choses comme:

{ user.get_profile.about }} # get profile information 

donc je pensais écrire mon premier mot-clé modèle Django pour que je puisse l'utiliser comme ceci:

{% webapp_user_lookup user %} # my custom tag 
    {% ifnot unRegistered %} 
    {{ user.get_profile.about }} # get profile information - would fail with a string 
    {% endifnot %} 
{% endfor %} 

Le code que j'utilise ailleurs pour rechercher un utilisateur dans une vue est :

try: 
     user = User.objects.get(username__iexact=user) 
     unRegistered = False 
     if not other_user.is_active: 
       unRegistered = True 
except: 
     unRegistered = True 

recherche Cependant les exemples d'étiquette Django modèle que je vais avoir du mal à comprendre la meilleure façon de structurer l'étiquette de modèle personnalisé, prendre mon nom d'utilisateur string - et renvoyer les résultats comme un objet si elles existent, ou un ensemble un varible sinon et la chaîne d'origine. J'aimerais vraiment mieux comprendre comment la structure fonctionne, et si j'ai besoin d'un 'cours' et si oui, pourquoi. (Je suis nouveau à la programmation).

Répondre

3

utiliser un filtre de modèle comme ceci:

{{username|get_user}} 

dans votre user_template_tags.py:

from django import template 
from django.contrib.auth.models import User 

register = template.Library() 

######################## 

def get_user(username): 
    try: 
     user = User.objects.get(username__iexact=username) 
    except User.DoesNotExist: 
     user = User.objects.none() 
    return user 

register.filter('get_user',get_user) 

alors dans votre modèle, vous pouvez faire quelque chose comme:

{% with username|getuser as user %} 
{% if user %}DO USER STUFF 
{% else %}DO UNREGISTERED STUFF 
{% endif %} 
{% endwith %} 
+0

noter que lorsque vous mettez {{user}} j'ai aussi utilisé {{username}} –

+0

, sauf si vous l'avez compensé dans la sauvegarde de l'utilisateur. ethod, django peut stocker un nom d'utilisateur de JOESHMO et joeshmo qui lancerait une erreur. Vous pouvez laisser la partie "User.DoesNotExist" si cela n'est pas géré. –

+0

Brandon cela semble vraiment simple et je peux comprendre votre code - je vais juste jouer avec maintenant, merci d'avoir pris le temps d'écrire un exemple clair. –

Questions connexes