2009-06-21 2 views
0

Я использую стандартную модель пользователя (django.contrib.auth), которая поставляется с Django. Я сделал некоторые из моих собственных моделей в приложении Django и создал отношения между так:Django - альтернатива подклассу Пользователь?

from django.db import models 
from django.contrib.auth.models import User 

class GroupMembership(models.Model): 
    user = models.ForeignKey(User, null = True, blank = True, related_name='memberships') 
    #other irrelevant fields removed from example 

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

user.memberships.all() 

Однако Я хочу, чтобы иметь возможность сделать более сложный запрос, например:

user.memberships.all().select_related('group__name') 

Это прекрасно работает, но я хочу, чтобы извлечь эти данные в шаблоне. Кажется глупым пытаться поставить такую ​​логику внутри шаблона (и я не могу заставить его работать в любом случае), поэтому я хочу создать лучший способ сделать это. Я мог бы подкласса User, но это не похоже на отличное решение - я могу в будущем захотеть перенести свое приложение на другие сайты Django, и, предположительно, если бы было какое-то другое приложение, которое не было бы подклассифицировано пользователем I способный заставить его работать.

Лучше всего создать метод внутри GroupMembership, который называется что-то вроде get_by_user(user)? Смогу ли я назвать это из шаблона?

Я был бы признателен за любые советы, которые могут оказать на структурирование этого - извините, если это немного длинный/неопределенный.

+0

Знаете ли вы, что модель пользователя имеет методы, добавленные к ней определением членства в вашей группе? –

+0

Я не знал, что он добавил методы. Я знал, что это создаст свойство User.memberships, но разве это не все? –

ответ

3

Во-первых, вызывая select_related и передавая аргументы, ничего не делает. Это намек на то, что кеш должен быть заполнен.

Вы никогда бы не позвонили select_related в шаблон, только функция просмотра. И только тогда, когда вы знали, что вам нужны все связанные объекты для другой обработки.

«Лучше всего создать метод внутри GroupMembership, называемый как get_by_user (пользователь)?»

У вас есть это. Я не уверен, что с этим не так.

GroupMembership.objects.filter(user="someUser") 

«Могу ли я назвать это из шаблона?»

Нет. Это то, для чего предназначены функции просмотра.

groups = GroupMembership.objects.filter(user="someUser") 

Тогда вы предоставляете groups объект в шаблон для рендеринга.


Редактировать

Это одна строка кода; не кажется, что обременительное бремя включить это во все ваши функции просмотра.

Если вы хотите, чтобы на каждой странице, у вас есть много вариантов, которые не связаны с повторением этой строки кода ..

  1. функция зрения может вызвать другую функцию.

  2. Возможно, вы захотите попробовать объекты с возможностью вызова вместо простых функций; они могут подклассифицировать общий вызываемый объект, который заполняет эту информацию.

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

  4. Вы можете написать свой собственный декоратор, чтобы убедиться, что это делается во всех функциях вида, в которых есть декоратор.

+0

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

+2

Вы можете написать шаблон-тег, который сделает фильтрацию для вас. Используйте его в шаблоне базы один раз - нет необходимости в c & p. Логика будет такой же, как и в функции вида. http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#howto-custom-template-tags – vikingosegundo