Django UserProfile ... без пароля - PullRequest
       28

Django UserProfile ... без пароля

3 голосов
/ 05 октября 2008

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

Итак, я думаю, что возникает вопрос, как лучше всего настроить таблицу «People», которая связана с таблицей User без фактического расширения таблицы User с помощью UserProfile.

Ответы [ 7 ]

7 голосов
/ 05 октября 2008

A профиль пользователя (как возвращено django.contrib.auth.models.User.get_profile) не расширяет таблицу User - модель, которую вы указываете как модель профиля с параметром AUTH_PROFILE_MODULE, является просто моделью, которая имеет * От 1005 * до User. get_profile и настройка - это всего лишь удобный API для доступа к экземпляру конкретной модели, которая имеет ForeignKey к конкретному User экземпляру.

Таким образом, одним из вариантов является создание модели профиля, в которой значения ForeignKey - User могут быть null, и сопоставление вашей модели Photo с этой моделью профиля вместо модели User. Это позволит вам создать профиль для несуществующего пользователя и присоединить зарегистрированного пользователя к профилю позднее.

3 голосов
/ 07 октября 2008

Укажите свою собственную процедуру аутентификации, тогда вы можете проверить (или не проверить) все, что вам нравится. Мы делаем это так, что если они терпят неудачу при обычном имени пользователя, мы также можем впустить их по электронной почте / паролю (хотя это не то, что я показываю ниже).

в settings.py:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
    'userprofile.my_authenticate.MyLoginBackend', # if they fail the normal test
 )

в userprofile / my_authenticate.py:

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User

class MyLoginBackend(ModelBackend):
    """Return User record if username + (some test) is valid.
       Return None if no match.
    """

    def authenticate(self, username=None, password=None, request=None):
        try:
            user = User.objects.get(username=username)
            # plus any other test of User/UserProfile, etc.
            return user # indicates success
        except User.DoesNotExist:
            return None
    # authenticate
# class MyLoginBackend
3 голосов
/ 05 октября 2008

Пользователи, которые не могут войти? Просто дал им совершенно произвольный пароль.

import random
user.set_password( str(random.random()) )

Они никогда не смогут войти в систему.

0 голосов
/ 08 октября 2008

Еще одно возражение за ответ Инсина : обработайте это через UserProfile. Джеймс Беннетт имеет замечательную статью о расширении django.contrib.auth.models.User. Он проходит через несколько методов, объясняет их плюсы и минусы и приземляется на путь UserProfile как идеальный.

0 голосов
/ 07 октября 2008

django.contrib.auth.models.User существует исключительно для цели использования бэкэнда аутентификации по умолчанию (на основе базы данных). Если вы пишете свой собственный бэкэнд, вы можете сделать некоторые учетные записи без пароля, сохраняя при этом обычные учетные записи с паролями. В документации по Django есть глава об этом .

0 голосов
/ 07 октября 2008

Использование модели с полем ForeignKey, связывающим пользователя , может работать не так, как вы хотите, потому что вам нужен анонимный доступ. Я не уверен, что это сработает, но вы можете попробовать, что произойдет, если вместо него у него будет ForeignKey с AnonymousUser (чей идентификатор всегда None!).

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

0 голосов
/ 05 октября 2008

Из документации по django auth , если вы хотите использовать модель User, обязательно иметь имя пользователя и пароль, «анонимных учетных записей» не существует. Я полагаю, вы могли бы создать учетные записи с паролем по умолчанию, а затем дать людям возможность включить «настоящую» учетную запись (установив пароль самостоятельно).

Чтобы настроить таблицу «Люди», связанную с таблицей User, вам просто нужно использовать поле ForeignKey (на самом деле это рекомендуемый способ добавления дополнительной информации в модель User, а не наследования)

...