2016-02-23 1 views
5

Est-il possible de créer des comptes d'utilisateurs avec email comme nom d'utilisateur et pas d'autres détails tels que mot de passe en utilisant allauth? L'intention est de rendre le processus d'inscription aussi facile que possible. Le mot de passe peut-il être ignoré lors de l'inscription et être mis à jour lors de la confirmation par courriel? J'ai essayé ce scénario dans le shell python (./manage.py shell) et ai eu des résultats réussis.Django allauth inscription sans mot de passe

In [1]: from django.contrib.auth.models import User 

In [2]: User.objects.create(username='nopass') 
Out[2]: <User: nopass> 

In [3]: User.objects.all() 
Out[3]: [<User: userone>, <User: nopass>] 
In [4]: usr=User.objects.all()[1] 
In [5]: usr.set_password('pwdnotset') 
In [6]: usr.save() 
In [7]: from django.contrib.auth import authenticate 
In [8]: authenticate(username='nopass',password='pwdnotset') 
Out[8]: <User: nopass> 

J'ai parlé this link et a constaté qu'il n'y avait pas ces paramètres pour allauth à ce moment-là. Cependant, la réponse a été postée en 2013. Il serait utile de créer un moyen de créer un utilisateur sans mot de passe à l'inscription avec une configuration allauth. Merci d'avance.

+1

Avez-vous trouvé un ansewer? –

+0

Je pense que vous pouvez résoudre cela en écrivant un adaptateur allauth pour cela. Permettez-moi de parcourir à nouveau mon code de dépôt. Si j'ai trouvé que je vais le poster ici. :) – cutteeth

Répondre

0

Je pense que creating a signup form with an overridden signup() which sets an unusable password to user et en disant allauth d'utiliser ce formulaire pour le processus d'inscription va résoudre ce problème. Créer un formulaire d'inscription en remplaçant inscription() comme celui donné ci-dessous.

class UserCreationForm(forms.ModelForm): 
    username = forms.CharField(label=_("username")) 
    # declare other fields also 
    ... 
    def signup(self, request, user): 
     user.username = self.cleaned_data['username'] 
     # make sure you are saving all needed data for user model. 
     user.set_unusable_password() 
     user.save() 

dans settings.py, dites allauth d'utiliser cette forme pour inscription

ACCOUNT_SIGNUP_FORM_CLASS = 'yourapp.forms.UserCreationForm' 

Ci-dessous est donnée une trace de pile d'IPDB pour le contexte ci-dessus.

 48   import ipdb;ipdb.set_trace(); 
---> 49   user.email = self.cleaned_data['email'] 
    50   user.username = self.cleaned_data['username'] 

ipdb> user 
<User: test_user> 

ipdb> user.save() 
*** IntegrityError: NOT NULL constraint failed: user.password 

ipdb> user.set_unusable_password() 
ipdb> user.save() 
ipdb> user 
<User: test_user> 
ipdb> 
0

Je ne vois pas de moyen de le faire dans allauth pour l'instant, sauf en personnalisant le code pour votre projet.

Contrairement à ce que d'autres réponses disent, le code allauth.account.forms fait l'SignUpForm Hériter de votre formulaire d'inscription personnalisé:

# in allauth.account.forms.py 
class BaseSignupForm(_base_signup_form_class()): 

BaseSignupForm est utilisé pour les deux « standard » s'inscrire et compte des aspects sociaux Sign- en haut ce que sous-classes SignupForm et ajoute en inscription « standard », les champs de mot de passe:

# in allauth.account.forms.py 
class SignupForm(BaseSignupForm): 
def __init__(self, *args, **kwargs): 
    super(SignupForm, self).__init__(*args, **kwargs) 
    self.fields['password1'] = PasswordField(label=_("Password")) 
    if app_settings.SIGNUP_PASSWORD_ENTER_TWICE: 
     self.fields['password2'] = PasswordField(
      label=_("Password (again)")) 

Alors, j'ai essayé de cacher le champ dans le modèle de vue, mais pas de chance. Peut-être que l'utilisation d'un FormHelper en crispyforms est le moyen.