Question

J'aimerais créer un sous-ensemble d'utilisateurs qui ne disposent pas d'un identifiant de connexion ... essentiellement comme moyen d'ajouter un champ de photographe aux photos sans qu'un compte complet ne soit associé à cette personne (dans de nombreux cas, ils ne se connecteront jamais réellement sur le site). Une mise en garde est que j'aimerais aussi pouvoir activer un compte pour eux plus tard.

Donc, je pense que la question est de savoir quel est le meilleur moyen de créer un "People". table qui est liée à la table utilisateur sans étendre réellement la table utilisateur avec UserProfile.

Était-ce utile?

La solution

Un profil d'utilisateur (tel que renvoyé par django.contrib.auth.models.User.get_profile ) ne prolonge pas la table User - le modèle que vous spécifiez comme modèle de profil avec le paramètre AUTH_PROFILE_MODULE est juste un modèle qui a un ForeignKey à Utilisateur . get_profile et le paramètre ne sont en réalité qu'une API très pratique pour accéder à une instance d'un modèle spécifique comportant un ForeignKey vers une instance Utilisateur spécifique.

En tant que tel, une option consiste à créer un modèle de profil dans lequel le ForeignKey en Utilisateur peut être null et associer votre . Modèle photo avec ce modèle de profil au lieu du modèle Utilisateur . Cela vous permettrait de créer un profil pour un utilisateur non existant et d'associer ultérieurement un utilisateur enregistré au profil.

Autres conseils

Utilisateurs qui ne peuvent pas se connecter? Je viens de leur donner un mot de passe totalement aléatoire.

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

Ils ne pourront jamais se connecter.

Fournissez votre propre routine d’authentification, vous pourrez alors vérifier (ou non) tout ce que vous voulez. Nous faisons cela, donc s'ils échouent sous leur nom d'utilisateur normal, nous pouvons également les laisser entrer dans leur adresse e-mail / mot de passe (bien que ce ne soit pas ce que je montre ci-dessous).

dans settings.py:

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

dans 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

D'après la documentation sur la autorisation django , si vous souhaitez utiliser Dans le modèle utilisateur, il est obligatoire de disposer d'un nom d'utilisateur et d'un mot de passe, il n'y a pas de "comptes anonymes". Je suppose que vous pouvez créer des comptes avec un mot de passe par défaut, puis donner aux utilisateurs la possibilité d'activer un compte "réel". compte (en définissant un mot de passe eux-mêmes).

Pour configurer un "Personnes" " table qui est liée à la table utilisateur, il vous suffit d’utiliser un champ ForeignKey (c’est en fait le moyen recommandé d’ajouter des informations supplémentaires au modèle User, et non à un héritage)

Utilisation d'un modèle avec une clé étrangère La liaison de champ à l'utilisateur peut ne pas fonctionner comme vous le souhaitez car vous avez besoin d'un accès anonyme. Je ne sais pas si cela va fonctionner, mais vous pouvez essayer ce qui se passe si vous laissez une ForeignKey à AnonymousUser (dont l'identifiant est toujours None!).

Si vous l'essayez, postez vos résultats ici, je serais curieux.

django.contrib.auth.models.User existe uniquement dans le but d'utiliser le système d'authentification par défaut (basé sur une base de données). Si vous écrivez votre propre backend, vous pouvez créer des comptes sans mot de passe, tout en conservant les comptes normaux avec des mots de passe. La documentation de Django comporte un chapitre sur ce sujet . / p>

Un autre vote positif pour la réponse de insin : gérez cela à l'aide d'un UserProfile . James Bennett a un excellent article sur l'extension du django.contrib.auth.models.User . Il passe en revue plusieurs méthodes, explique leurs avantages / inconvénients et atterrit comme idéal sur le chemin UserProfile .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top