Определение двух разных расширений для модели User - PullRequest
3 голосов
/ 18 марта 2011
class CustomerProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    gender = models.CharField(max_length=1,blank=True)
    zip_code = models.IntegerField()

class StoreProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    phone_number = models.IntegerField()

Я хотел бы иметь возможность войти в систему / аутентифицировать пользователя как «магазин» или «клиент».

  1. Есть ли способ заставить эту работу работать с вышеуказанной моделью?

  2. Я также буду смотреть на декоратор @login_required, чтобы различать магазин, в котором выполнен вход, и покупателя.Любой совет, как поступить?

Ответы [ 3 ]

2 голосов
/ 18 марта 2011

Я хотел бы иметь возможность войти в систему / аутентифицировать пользователя как «магазин» или «клиент».

Есть ли способ заставить эту работу работать с вышеуказанной моделью?

Да, но.

http://docs.djangoproject.com/en/1.2/topics/auth/#storing-additional-information-about-users

Если вы хотите использовать автоматические функции, вы получаете один (один) объект класса Profile, связанный с пользователем.

Если вы не хотите использовать функции автоматического профиля, он будет работать просто отлично. Вы не сможете использовать настройку AUTH_PROFILE_MODULE или метод get_profile() User. Вы будете вынуждены написать много

try:
    CustomerProfile.objects.get( user=request.user )
except CustomerProfile.DoesNotExist:
    # hmmm.  Must be a Store, not a Customer.

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

Я также буду смотреть на декоратор @login_required, чтобы различать магазин, в котором зарегистрирован и покупатель. Любой совет, как поступить?

  1. Добавьте метод save() к каждому классу, который проверяет существование объекта объекта. Если вы попытаетесь создать CustomerProfile для пользователя, CustomerProfile.save () проверит StoreProfile и сгенерирует исключение, если оно существует.

    Два отношения являются эксклюзивными. Вы должны убедиться в этом в своих различных моделях.

  2. Напиши два декоратора, ты будешь счастливее. Они имеют значительное перекрытие, но лучше написать много простых декораторов без параметров, чем работать с убер-декоратором.

    @customer_required и @store_required. Каждый будет делать то, что делает @login_required, а также определять, какие отношения с Пользователем имеет запись customer_required должен проверить наличие отношений CustomerProfile с пользователем. store_required проверяет связь StoreProfile с пользователем.


http://docs.djangoproject.com/en/1.2/topics/auth/#groups

С другой стороны, у вас есть группы, определенные в Django. Я бы порекомендовал вам использовать группы и названия групп вместо того, чтобы пытаться создавать такие необычные профили.

Иметь один "главный" профиль со всеми атрибутами.

Используйте таблицу Django Group, чтобы определить различные роли («Пользователь», «Магазин») и правильно распределить пользователей по группам.

Затем проверьте имя группы в ваших декораторах авторизации @store_required и @customer_required.

2 голосов
/ 18 марта 2011

AFAIK это не может быть сделано.Но вы можете попробовать это:

class UserProfile(models.Model):
    user = ForeignKey(User, unique=True)
    store = OneToOneField(Store, blank=True, null=True)
    customer = OneToOneField(Customer, blank=True, null=True)

и установить только один из store или customer при создании профиля для пользователя.

0 голосов
/ 18 марта 2011

То, как вы расширяете пользовательскую модель с помощью новой внешней таблицы, не требует изменений в вашем подходе - так что это нормально.

Одним из способов решения этой проблемы является использование логики login_required, но также назначение разрешений для аутентификации Django пользователям при их создании - один для магазина и один для клиента. В противном случае вы могли бы просто написать служебную функцию, чтобы определить их членство на основе их присутствия во внешней таблице. Для получения дополнительной информации см. http://docs.djangoproject.com/en/dev/topics/auth/

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