2009-05-28 10 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() 

例のデータは次のようになり、「登山エベレスト」の活動と、それは彼らとのコメントをかかった時間、各ユーザが入力することができるだろう。

これは私の質問です。すべてのアクティビティのリストを表示するにはどうすればよいのですか?ユーザーがそのアクティビティのデータを入力した場合は、アクティビティの横に関連する詳細を表示しますか?

はこれまでのところ、私は考えた:

  • は、アクティビティIDとユーザーのUserActivityWorkの値のキーを持つ UserActivityWorkの辞書を作成します。これは、 私では良いですが、私はどのように行うのか分かりません これはdjangoのテンプレートシステムで(つまり、どのように言う:{{user_work [activity.id]}})
  • オブジェクトを作成するアクティビティと UserActivityWorkの両方を保持します( )。私はこれをやっていない 私はdjango がこれを行うより良い方法があることを望んでいるので、1つ。

洞察力があれば幸いです!あなたは2つのクエリセットは、テンプレート内からアクセス可能持っていると仮定すると、

答えて

1

素朴な方法は、各アクティビティの上にして、各ユーザのアクティビティを反復することであろう(活動や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さん、ありがとうございます。私はあなたが提案したようにカスタムテンプレートタグを書くことが行く方法であることを発見しました。 誰かがこの問題を抱えている場合に備えて、ここでは悲惨な詳細があります。ビュー方式で

、私は、これはの関連するセクションでその活動上のユーザの作業にログイン

ためUserActivityWorkオブジェクトのactivity.idと値のキーが含まれている辞書「user_activity_status」を公表テンプレート。基本的にこれは

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

の値を変数「map_value」を追加しようとしてここにテンプレートです:ここ

{% 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 '' 
関連する問題