2009-05-28 71 views
1

這裏是我的模型:Django問題:如何獲取與域對象相關的用戶特定信息?

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() 

示例數據將是,「攀登珠穆朗瑪峯」的活動,並且每個用戶將能夠輸入了多長時間他們和評論。

以下是我的問題:如何顯示所有活動的列表,並且如果用戶輸入了該活動的數據,則在活動旁邊顯示相關的詳細信息?

到目前爲止,我已考慮:

  • 創建 UserActivityWork的字典,活動ID的密鑰和用戶的UserActivityWork的值。這可以用 我,但我不知道如何做 這在django的模板系統(即,你怎麼說:{{user_work [activity.id]}})
  • 創建一個對象同時持有 Activity和 UserActivityWork。我還沒有做過這個 之一,因爲我希望django 有更好的方法來做到這一點。

任何有識之士將不勝感激!

回答

1

假設你有2個查詢集從模板中accessable(也就是說,作爲活動和user_activities)

一個天真的方法是遍歷每一項活動,然後在每個用戶的活動。

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

字典查找可以在模板中,通過使用一個點來進行

從技術上講,當模板系統遇到一個點,它會嘗試下面的查找,以該順序(。):

  • 字典查找
  • 屬性查找
  • 方法調用
  • 列表索引查找

另一種選擇是創建一個custom template tag。您可以像以前一樣遍歷活動列表,然後將活動以及user_activity列表或用戶傳遞給標記以執行查找並呈現所需的數據。

0

謝謝你的提示,Gerry。我發現按照您的建議編寫自定義模板標籤是最佳選擇。 這裏是血淋淋的細節,以防止任何人絆倒這一點。

在視圖的方法,我出版了一本字典「user_activity_status」,其中包含activity.id和UserActivityWork對象的價值,爲登錄用戶的工作,對活動

關鍵這是對的相關章節模板。基本上,這將增加一個變量「map_value」與

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

這裏的值是模板:

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

這裏是templatetag文件的部分(見格里的鏈接,細節如何設置此)

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 '' 
相關問題