Pregunta

Estoy tratando de hacer un sitio web, donde las personas solo ponen sus direcciones de correo electrónico y están iniciadas con cookies y todo. En una etapa posterior, les pediré que proporcionen contraseña y nombres, pero no se utilizará ningún nombre de usuario. Estoy tratando de hacer esto con Django-Registraition, pero obtengo errores y tengo algunos problemas.

Primero en deshabilitar los nombres de usuario como una función de inicio de sesión, puse STR (Time ()) en lugar de nombre de usuario: estaba buscando algo que cambie cada vez.

Sin embargo, cuando me salteo la autenticación (que actualmente no necesito) recibo error:

'RegistrationProfile' object has no attribute 'backend'

Alternativamente, puedo dejar la autenticación, pero luego no sé cómo autenticarla solo con correo electrónico y sin contraseña. Además, no sé cómo hacer que la próxima línea funcione:

auth.login(request, ProfileUser)

Si alguien puede sacarme de aquí, sería increíble. Aquí hay algún código:

mi clase de formulario:

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

mi vista:

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
        )

y publicaré cualquier otro recorte requerido felizmente

¿Fue útil?

Solución

Estás obteniendo el 'RegistrationProfile' object has no attribute 'backend' Error porque el usuario aún no está autenticado. Para registrar a alguien, tienes que llamar al authenticate Método primero, que requiere una contraseña. Entonces, lo que puedes hacer en su lugar es esto:

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)

Luego, para registrar a alguien, solo llame al _login_user función con la solicitud y User modelo. (Esto será profile.user En su caso, probablemente) haga esto en lugar de llamar auth.login. No estoy seguro de cómo va a determinar si este es un usuario válido o no, sin una contraseña o nombre de usuario, pero se lo dejaré. Si todavía tienes problemas, avísame.

Breve explicación:

Lo que básicamente sucede aquí es que Django requiere que un usuario sea autenticado para iniciar sesión a través del login función. Que la autenticación generalmente lo realiza el authenticate función, que requiere un nombre de usuario y contraseña, y verifica si la contraseña suministrada coincide con la versión hash en la base de datos. Si lo hace, agrega un backend de autenticación al User modelo.

Entonces, dado que no tiene contraseña y nombre de usuario, solo tiene que escribir su propio método para agregar el backend de autenticación al User modelo. Y eso es lo que mi _login_user) la función lo hace: si el usuario ya está autenticado, solo llama login, de lo contrario, primero agrega el backend predeterminado al User modelo, sin verificar un nombre de usuario y contraseña correctos (como authenticate lo hace).

Otros consejos

Para otros que leen este hilo, recibí un mensaje de error similar cuando estaba usando user.objects.create () en lugar de user.objects.create_user (). Básicamente, el primer método fue configurar una contraseña clara, mientras que Create_user cifra la contraseña. Las contraseñas de claro no se autenticarán. Verifique su base de datos, si tiene contraseñas establecidas en BARRO, entonces es probable que necesite usar create_user ().

La solicitud del autor podría solucionarse simplemente configurando un usuario y contraseña predeterminados usando create_user () en lugar de solo user.save ().

Puede crear una contraseña conocida (colóquela en settings.py) y usarla como si el usuario ingresara. Cree el usuario con esto y autentique al usuario con esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top