2009-05-28 8 views
1

Voici mes modèles:Question Django: comment puis-je obtenir des informations spécifiques à un utilisateur sur un objet de domaine?

class Activity(models.Model): 
    title = models.CharField(blank=False, max_length=100) 
    description = models.TextField(blank=False) 


class UserActivityWork(models.Model): 
    activity = models.ForeignKey(Activity) 
    user = models.ForeignKey(User) 
    hours_worked = models.FloatField() 
    comment = models.TextField() 

Exemple de données seraient, une activité de « l'escalade du Mont Everest » et chaque utilisateur serait en mesure d'entrer combien de temps il leur a fallu et un commentaire.

Voici ma question: Comment puis-je afficher une liste de toutes les activités, et si l'utilisateur a entré des données pour cette activité, afficher les détails pertinents à côté de l'activité?

Jusqu'à présent, j'ai considéré:

  • créer un dictionnaire de UserActivityWork avec une clé de l'ID d'activité et une valeur de UserActivityWork de l'utilisateur. Ce serait bien avec moi, mais je n'ai aucune idée de la façon de faire cela dans le système de modèle de django (ie, comment dites-vous: {{user_work [activity.id]}})
  • créer un objet qui serait maintenez à la fois l'activité et UserActivityWork. Je n'ai pas fait cela, car j'espère que django a une meilleure façon de le faire.

Toute idée serait grandement appréciée!

Répondre

1

En supposant que vous avez 2 QuerySets Accessable à partir de votre modèle (par exemple les activités et user_activities)

Une façon naïve serait de itérer sur chaque activité et sur chaque activité de l'utilisateur.

{% for activity in activities %} 
    {{ activity.title }} 
    {% for user_activity in user_activities %} 
     {% ifequal user_activity.activity activity %} 
      Display userdata 
     {% endifequal %}  
    {% endfor %} 
{% endfor %} 

lookups Dictionary peuvent être effectués dans les modèles en utilisant un point

Techniquement, lorsque le système de modèle rencontre un point, il essaie les recherches suivantes, dans cet ordre (.):

  • Dictionnaire recherche
  • Attribute recherche
  • appel Méthode
  • Liste index recherche

Une autre option serait de créer un custom template tag. Vous pouvez passer en boucle sur la liste des activités comme auparavant, puis transmettre l'activité et la liste user_activity ou l'utilisateur à la balise pour effectuer la recherche et afficher les données requises.

0

Merci pour l'indice, Gerry. J'ai trouvé que l'écriture d'un tag de modèle personnalisé comme vous l'avez suggéré était la voie à suivre. Voici les détails sanglants, au cas où quelqu'un trébucherait à travers cela.

Dans la méthode d'affichage, j'ai publié un dictionnaire « user_activity_status » qui contient une clé de activity.id et la valeur de l'objet UserActivityWork pour l'utilisateur connecté dans le travail de l'utilisateur sur cette activité

C'est la section pertinente du modèle.En gros, cela va ajouter une variable « map_value » avec une valeur de

getattr(user_activity_status[activity.id], "comment") 

Voici le modèle:

{% load *file-name-of-the-templatetag-file* %} 
{% access_map_method user_activity_status activity.id comment %} 
{% if map_value %} 
    {{ map_value }} 
{% else %} 
    get working sucka! 
{% endif %} 

est la partie ici du fichier templatetag (voir les liens de Gerry pour les détails de la façon de régler ceci)

from django import template 

register = template.Library() 

@register.tag(name="access_map_method") 
def do_access_map_method(parser, token): 
    try:  
     tag_name, dict_name , key_name, method_name = token.contents.split() 
    except ValueError: 
     msg = '%r tag requires three arguments' % token.contents[0] 
     raise template.TemplateSyntaxError(msg) 

    return MapNode(dict_name , key_name, method_name) 

class MapNode(template.Node): 
    def __init__(self, dict_name, key_name, method_name): 
     self.dict_var = template.Variable(dict_name) 
     self.key_var = template.Variable(key_name) 
     self.method_name = method_name 

    def render(self, context): 
     try: 
      dict_obj = self.dict_var.resolve(context) 
      key_obj = self.key_var.resolve(context) 
      if key_obj in dict_obj.keys(): 
       if self.method_name: 
        context['map_value'] = getattr(dict_obj[key_obj], self.method_name) 
       else: 
        context['map_value'] = dict_obj[key_obj] 
      else: 
       context['map_value'] = '' 
     except template.VariableDoesNotExist: 
      context['map_value'] = '' 

     return '' 
Questions connexes