Question

Je suis en train de faire un site web, où les gens ne mettent que leurs adresses e-mail et ils sont connectés avec les cookies et tous. À un stade ultérieur, je vais leur demander un mot de passe et fournir les noms, mais aucun nom d'utilisateur sera utilisé. Je suis en train de le faire avec django-registraition, mais je reçois des erreurs et j'ai quelques problèmes.

Tout d'abord pour désactiver les noms d'utilisateur en tant que fonction de connexion, je mis str (time ()) au lieu de nom d'utilisateur - je cherchais quelque chose qui changera chaque fois

.

Cependant, quand je sauter l'authentification (que je ne ai pas besoin actuellement) je reçois l'erreur:

'RegistrationProfile' object has no attribute 'backend'

Sinon, je peux laisser l'authentification, mais alors je ne sais pas comment authentifier uniquement avec le courrier électronique et aucun mot de passe. En outre, je ne sais pas comment faire le prochain travail de ligne:

auth.login(request, ProfileUser)

Si quelqu'un peut me sortir d'ici, ce serait génial. Voici un code:

ma forme Classe:

class RegistrationFormCustom(forms.Form):
email = forms.EmailField()
def do_save(self):
    new_u = User(username=str(time()),email= self.cleaned_data.get('email'),)
    new_u.save()
    new_p = Profile.objects.create_profile(new_u)
    new_p.save()
    return new_p

mon point de vue:

def registerCustom(request, backend, success_url=None, form_class=None,
         disallowed_url='registration_disallowed',
         template_name='registration/registration_form.html',
         extra_context=None,
     initial={}):

form = RegistrationFormCustom(initial=initial)
if request.method == 'POST':
    form = RegistrationFormCustom(initial=initial, data=request.POST)
    if form.is_valid():
        profile = form.do_save()
        profile = auth.authenticate(username = profile.user.email, password = form.cleaned_data.get('pass1'))
        print(profile)
        auth.login(request, profile)
        return redirect('/')

    else:
        pass

return render_jinja(request, 'registration/registration_form.html',
        type="register",
        form = form
        )

et je signalerai tout autre Snipped nécessaire heureusement

Était-ce utile?

La solution

Vous obtenez l'erreur de 'RegistrationProfile' object has no attribute 'backend' parce que l'utilisateur n'a pas encore été authentifié. Pour se connecter à quelqu'un, vous devez appeler la méthode authenticate premier, ce qui nécessite un mot de passe. Donc, ce que vous pouvez faire à la place, est la suivante:

from django.contrib.auth import load_backend, login, logout
from django.conf import settings

def _login_user(request, user):
    """
    Log in a user without requiring credentials (using ``login`` from
    ``django.contrib.auth``, first finding a matching backend).

    """
    if not hasattr(user, 'backend'):
        for backend in settings.AUTHENTICATION_BACKENDS:
            if user == load_backend(backend).get_user(user.pk):
                user.backend = backend
                break
    if hasattr(user, 'backend'):
        return login(request, user)

Alors, de se connecter quelqu'un, il suffit d'appeler la fonction _login_user avec le modèle de demande et User. (Ce sera profile.user dans votre cas, probablement) Pour ce faire, au lieu d'appeler auth.login. Je ne sais pas comment vous allez déterminer si cela est un utilisateur valide ou non, sans un mot de passe ou nom d'utilisateur, mais je vais laisser ça à vous. Si vous avez encore des problèmes, laissez-moi savoir.

Court Explication:

Qu'est-ce qui se passe essentiellement ici est que Django a besoin d'un utilisateur soit authentifié afin d'être connecté via la fonction login. Cette authentification se fait habituellement par la fonction authenticate, ce qui nécessite un nom d'utilisateur et mot de passe, et vérifie si le mot de passe fourni correspond à la version hachée dans la base de données. Si elle le fait, il ajoute un backend d'authentification au modèle User.

Alors, puisque vous ne disposez pas d'un mot de passe et nom d'utilisateur, il vous suffit d'écrire votre propre méthode pour ajouter le back-end d'authentification au modèle User. Et c'est ce que ma fonction _login_user) fait -. Si l'utilisateur est déjà authentifié, il appelle simplement login, sinon, il ajoute d'abord le backend par défaut au modèle User, sans vérifier un nom d'utilisateur et mot de passe (comme authenticate fait)

Autres conseils

Pour d'autres la lecture de ce fil, je reçu un message d'erreur similaire lorsque j'utilisais User.objects.create () au lieu de User.objects.create_user (). En fait, la première méthode est la fixation d'un mot de passe clair alors que le mot de passe create_user encrypte. les mots de passe clairs ne parviennent pas à authentifier. Vérifiez votre base de données, si vous avez des mots de passe définis en clair, alors il est probable que vous devez utiliser create_user () à la place.

La demande de l'auteur pourrait être résolu en mettant simplement un utilisateur par défaut et le mot de passe à l'aide create_user () au lieu d'user.save ().

Vous pouvez créer un mot de passe connu (le mettre dans settings.py) et l'utiliser comme si l'utilisateur est entré. Créer l'utilisateur avec cela et authentifier l'utilisateur avec cela.

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