Django - альтернатива юзерам? - PullRequest
0 голосов
/ 22 июня 2009

Я использую стандартную модель User (django.contrib.auth), которая поставляется с 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')

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

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

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

1 Ответ

3 голосов
/ 22 июня 2009

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

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

"Является ли лучшим создание метода внутри GroupMembership с именем что-то вроде get_by_user (user)?"

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

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

«Смогу ли я позвонить по шаблону?»

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

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

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


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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...