Domanda

Sto cercando di creare un sito Web, in cui le persone mettono solo i loro indirizzi e -mail e sono effettuati con cookie e tutto il resto. In una fase successiva, chiederò loro di fornire password e nomi, ma non verrà utilizzato nessun nome utente. Sto cercando di farlo con Django-Registration, ma ho errori e ho alcuni problemi.

Prima di disabilitare i nomi utente come funzionalità di accesso, ho messo STR (time ()) invece del nome utente - stavo cercando qualcosa che cambierà ogni volta.

Tuttavia, quando salto l'autenticazione (di cui al momento non ho bisogno) ricevo un errore:

'RegistrationProfile' object has no attribute 'backend'

In alternativa, posso lasciare l'autenticazione ma non so come autenticarla solo con e -mail e nessuna password. Inoltre, non so come far funzionare la riga successiva:

auth.login(request, ProfileUser)

Se qualcuno può tirarmi fuori di qui, sarebbe fantastico. Ecco un po 'di codice:

La mia classe di forma:

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

la mia opinione:

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
        )

E posterò felicemente qualsiasi altro brontolio richiesto

È stato utile?

Soluzione

Stai ottenendo il 'RegistrationProfile' object has no attribute 'backend' Errore perché l'utente non è ancora autenticato. Per accedere a qualcuno, devi chiamare il authenticate Metodo prima, che richiede una password. Quindi, quello che puoi fare invece è questo:

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)

Quindi, per accedere a qualcuno, chiama semplicemente il _login_user funzione con la richiesta e User modello. (Questo sarà profile.user Nel tuo caso, probabilmente) fallo invece di chiamare auth.login. Non sono sicuro di come hai intenzione di determinare se si tratta di un utente valido o meno, senza una password o un nome utente, ma te lo lascerò. Se hai ancora problemi, fammi sapere.

Breve spiegazione:

Ciò che in pratica accade qui è che Django richiede che un utente sia autenticato per essere effettuato l'accesso tramite il login funzione. Quell'autenticazione viene solitamente eseguita dal authenticate funzione, che richiede un nome utente e una password e verifica se la password fornita corrisponde alla versione hash nel database. In tal caso, aggiunge un backend di autenticazione al User modello.

Quindi, dal momento che non hai una password e un nome utente, devi solo scrivere il tuo metodo per aggiungere il backend di autenticazione al User modello. Ed è quello che il mio _login_user) funzione fa: se l'utente è già autenticato, chiama solo login, altrimenti, aggiunge innanzitutto il backend predefinito al User Modello, senza verificare un nome utente e una password corretti (come authenticate fa).

Altri suggerimenti

Per altri che leggono questo thread, ho ricevuto un messaggio di errore simile quando utilizzavo user.objects.create () anziché user.objects.create_user (). Fondamentalmente, il primo metodo era impostare una password chiara mentre Create_user crittografa la password. Le password di cancellazione non riusciranno ad autenticarsi. Controlla il tuo database, se hai le password impostate in Clear, è probabile che sia necessario utilizzare Create_User ().

La richiesta dell'autore potrebbe essere risolta semplicemente impostando un utente e una password predefiniti utilizzando create_user () anziché solo utente.save ().

È possibile creare una password nota (mettila in impostazione.py) e utilizzarla come se l'utente la inserisse. Crea l'utente con questo e autentica l'utente con questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top