Вопрос Django: как я могу получить информацию о пользователе, относящуюся к объекту домена? - PullRequest
1 голос
/ 28 мая 2009

Вот мои модели:

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

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

Ответы [ 2 ]

1 голос
/ 28 мая 2009

Предполагая, что у вас есть 2 набора запросов, доступных из вашего шаблона (скажем, как действия и user_activities)

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

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

Поиск в словаре можно выполнять в шаблонах с помощью точки (.)

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

  • Поиск по словарю
  • Поиск атрибутов
  • вызов метода
  • Поиск по индексу списка

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

0 голосов
/ 29 мая 2009

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

В методе view я опубликовал словарь "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 %}

здесь есть раздел файла тега шаблона (подробности о том, как его настроить, см. В ссылках Джерри)

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 ''
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...