J'utilise request.user.get_profile()
dans un certain nombre d'endroits dans mon code. Cependant, tous les utilisateurs n'ont pas un profil utilisateur assosié à leur compte. Est-il possible de créer un profil utilisateur automatiquement lorsque j'appelle le request.user.get_profile()
s'il n'en a pas un sans avoir à changer chacun de mes request.user.get_profile()
appels. Peut-être en utilisant des signaux ou quelque chose. Le problème que j'ai est que j'utilise un identifiant de connexion unique, donc si quelqu'un se connecte sur un autre système puis va sur mon site, il est connecté mais ne crée pas de profil utilisateur (je crée un utilisateur profil quand ils se connectent).Django créer userprofile si n'existe pas
Répondre
Généralement, les objets de profil utilisateur sont créés juste après la création de l'instance utilisateur. Ceci est facilement accompli en utilisant des signaux. Apparemment, l'utilisation de signaux au moment de la création de l'utilisateur ne fonctionnera pas pour vous. Une façon d'accomplir ce que vous essayez de faire serait de remplacer les appels à request.user.get_profile()
avec une fonction personnalisée. Dites get_or_create_user_profile(request)
. Cette fonction peut essayer de récupérer le profil d'un utilisateur et en créer un à la volée s'il n'en existe pas.
Pour exemple:
def get_or_create_user_profile(request):
profile = None
user = request.user
try:
profile = user.get_profile()
except UserProfile.DoesNotExist:
profile = UserProfile.objects.create(user, ...)
return profile
Merci. J'aime cette réponse mais je ne voulais pas changer toutes les instances de request.user.get_profile() dans mon code. N'y a-t-il pas un signal que je pourrais attacher au UserProfile post_get (je ne sais pas si cela existe) – John
@John: AFAIK il n'y a pas de signal intégré qui est envoyé sur 'get' (' post_get' comme vous l'avez dit). Les docs semblent être d'accord http://docs.djangoproject.com/en/dev/ref/signals/ –
et pourquoi ne pas le faire via le middleware? – John
J'ai trouvé cette solution que je préfère utiliser sur ce site: http://www.turnkeylinux.org/blog/django-profile
User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])
En utilisant une propriété comme cela semble plus propre que la définition d'une nouvelle méthode, mais je suis d'accord ce serait difficile de passer en revue votre base de code et de changer user.get_profile()
références à user.profile
.
Là encore, n'est-ce pas ce que votre fonction globale de recherche et de remplacement de fichiers est destinée?
Habituellement le premier utilisateur (superutilisateur) n'aura pas son profil créé car il a été créé pendant './manage.py startapp'. – hobbes3
Problème avec cette solution est qu'il va frapper la base de données pour récupérer le profil chaque fois que vous référencez User.profile. par exemple. Si vous faites quelque chose comme: User.profile.field = "derp" puis User.profile.save(), il rechargera .profile à partir de la base de données et perdra vos modifications avant d'enregistrer. Point étant que c'est une mauvaise utilisation des propriétés. Utilisez une méthode à la place pour cette fonctionnalité. – sqwerty
Hmm Je ne pense pas que ce soit une mauvaise utilisation des propriétés. Je posterai une amélioration cependant. –
Miser sur la réponse de bskinner et en réponse au commentaire de sqwerty, vous pouvez utiliser ceci:
def get_or_create_profile(user):
"""
Return the UserProfile for the given user, creating one if it does not exist.
This will also set user.profile to cache the result.
"""
user.profile, c = UserProfile.objects.get_or_create(user=user)
return user.profile
User.profile = property(get_or_create_profile)
Donc cela va créer un profil si nécessaire, et puis User.profile.field = "deep"
User.profile.save()
œuvres.
Révisée comme ci-dessous. Sinon, "AttributeError: impossible de définir l'attribut" sera affiché. La permission d'assignation du gardien est facultative ici.
def get_or_create_profile(user): profile, created = UserProfile.objects.get_or_create(user=user) assign('change_userprofile', user, profile) assign('delete_userprofile', user, profile) return profile User.profile = property(get_or_create_profile)
Voici une commande de gestion rapide qui peut être utilisée pour créer des profils par défaut pour les utilisateurs qui en sont dépourvus. Avec cela en place, vous pouvez exécuter ./manage.py missing_profiles
à tout moment, ou l'ajouter à une tâche cron, etc.
from django.core.management.base import BaseCommand
from django.contrib.auth.models import User
from people.models import Profile
'''
Create default profiles for any User objects that lack them.
'''
class Command(BaseCommand):
help = "Create default profiles for any User objects that lack them."
def handle(self, *args, **options):
users = User.objects.filter(profile=None)
for u in users:
Profile.objects.create(user=u)
print("Created profile for {u}".format(u=u))
- 1. Django - rediriger vers la page de connexion si la requête correspondante UserProfile n'existe pas Erreur
- 2. Django entrelacement UserProfile avec profil dans Admin
- 3. Django - Lier mes modèles aux profils (UserProfile) modèle
- 4. Django ayant des problèmes pour lier un UserProfile à l'utilisateur
- 5. Django, ModelForms, User et UserProfile - pas de mot de passe de hachage
- 6. créer si n'existe pas voir?
- 7. Java user.home est défini sur% userprofile% et n'est pas résolu
- 8. Comment obtenir% USERPROFILE% de ruby?
- 9. PostgreSQL créer table si existe pas
- 10. Créer une table si elle n'existe pas
- 11. si l'élément n'existe pas créer l'élément xml
- 12. rails: créer Parent, si n'existe pas, whilte créer enfant enregistrement
- 13. Décorateur Python pour les vues Django: Vérifier un paramètre particulier dans UserProfile
- 14. Hot pour ajouter la possibilité de rechercher dans UserProfile à UserAdmin dans Django | search_fields w/ForeignKey
- 15. Extension de l'objet Utilisateur dans Django: héritage du modèle utilisateur ou UserProfile?
- 16. Django URL ne correspond pas à même si elle devrait
- 17. Django-profils personnalisés créer/modifier ModelForm n'épargnent pas correctement
- 18. Comment créer un formulaire à partir de deux modèles dans Django
- 19. Django: Comment créer un leaderboard
- 20. django: modèles avec touches inverses?
- 21. MySql - Créer une table si elle n'existe pas? Sinon tronquer?
- 22. Créer une table si elle n'existe pas depuis mysqldump
- 23. Créer si une entrée n'existe pas, sinon mettre à jour?
- 24. mysql créer une vue seulement si elle n'existe pas
- 25. Créer une table SQLite seulement si elle n'existe pas
- 26. Les données de l'attribut personnalisé ne sont pas retournées dans l'objet UserProfile dans MOSS
- 27. Inlines dans Django Admin
- 28. Accès aux Sharepoint Propriétés UserProfile avec le script Powershell
- 29. Erreur Django: l'objet 'NoneType' n'est pas indicable
- 30. Récupère le chemin UserProfile actuel à partir d'un Service
pouvez-vous s'il vous plaît vérifier cette question SO http://stackoverflow.com/questions/17806683/create-row -of-date-while-creation-superuser auquel je suis confronté problème, pas capable de venir – user2086641