2009-05-28 2 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 с ключом ид активности и значением UserActivityWork пользователя. Это было бы хорошо с мной, но я не знаю, как это сделать это в системе шаблонов django (то есть, как вы говорите: {{user_work [activity.id]}})
  • создание объекта, который удерживайте как активность, так и UserActivityWork. Я не сделал этого , потому что я надеюсь, что у django есть лучший способ сделать это.

Любое понимание будет принята с благодарностью!

ответ

1

Если у вас есть 2 querysets, доступные из вашего шаблона (скажем, как деятельность и user_activities)

Наивный способом будет перебирать каждый вид деятельность, а затем по каждой пользовательской активности.

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

словарь поиски могут быть выполнены в шаблонах, используя точку

Технически, когда система шаблонов встречает точку, он пытается следующая Lookups, в таком порядке (.):

  • словарь поиск
  • Атрибут поиска
  • Метод вызова
  • Список индекс поиска

Другим вариантом было бы создать custom template tag. Вы можете перебрать список операций по-прежнему, а затем передать активность и список пользователей или пользователя в тег для выполнения поиска и отображения необходимых данных.

0

Спасибо за подсказку, Джерри. Я обнаружил, что писать собственный тег шаблона, как вы предлагали, - это путь. Вот подробности о горах, если кто-то споткнутся об этом.

В методе зрения, я опубликовал словарь «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 (см ссылки Gerry для деталей о том, как установите это значение)

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 '' 
Смежные вопросы