2014-12-18 2 views
1

У меня есть форма:Джанго пользователь Войти после создания успешного пользователя не удалось

class GeneralUserCreationForm(forms.ModelForm): 
""" 
A form that creates a user, with no privileges, from the given username and 
password. 
""" 
error_messages = { 
    'duplicate_username': ("This Username already exists."), 
    'password_mismatch': ("The two password fields didn't match."), 
} 
username = forms.RegexField(label=("Username"), max_length=30, 
    regex=r'^[\w.+-]+$', 
    help_text=("Required. 30 characters or fewer. Letters, digits and " 
       "/./+/-/_ only."), 
    error_messages={ 
     'invalid': ("This value may contain only letters, numbers and " 
        "./+/-/_ characters.")}, widget=forms.TextInput(attrs={'class':'input username'})) 
password1 = forms.CharField(label="Password", 
    widget=forms.PasswordInput(attrs={'class':'input username'})) 
password2 = forms.CharField(label=("Password confirmation"), 
    widget=forms.PasswordInput(attrs={'class':'input username'}), 
    help_text=("Enter the same password as above, for verification.")) 
email = forms.EmailField(label="Email", widget=forms.TextInput(attrs={'class':'input username'})) 
#gender = forms.CharField(widget=forms.PasswordInput(attrs={'class':'input username'})) 
date_of_birth = forms.CharField(label=("Date of birth"), 
    widget=forms.TextInput(attrs={'class':'input username', "placeholder": "YYYY-MM-DD"})) 

def __init__(self, *args, **kwargs): 
    super(GeneralUserCreationForm, self).__init__(*args, **kwargs) # Call to ModelForm constructor 
    self.fields['gender'].widget.attrs['style'] = 'width:190px; height:40px; font-family:arial; border:1px solid #CCC;' 
class Meta: 
    model = GeneralUser 
    fields = ("username", "email", "gender", "date_of_birth") 
def clean_username(self): 
    # Since User.username is unique, this check is redundant, 
    # but it sets a nicer error message than the ORM. See #13147. 
    username = self.cleaned_data["username"] 
    try: 
     User._default_manager.get(username=username) 
    except User.DoesNotExist: 
     return username 
    raise forms.ValidationError(
     self.error_messages['duplicate_username'], 
     code='duplicate_username', 
    ) 
def clean_password2(self): 
    password1 = self.cleaned_data.get("password1") 
    password2 = self.cleaned_data.get("password2") 
    if password1 and password2 and password1 != password2: 
     raise forms.ValidationError(
      self.error_messages['password_mismatch'], 
      code='password_mismatch', 
     ) 
    return password2 
def save(self, commit=True): 
    user = super(GeneralUserCreationForm, self).save(commit=False) 
    user.set_password(self.cleaned_data["password1"]) 
    if commit: 
     user.save() 
    return user 

и у меня есть представление для создания пользователя:

class GeneralUserCreateView(CreateView): 

form_class = GeneralUserCreationForm 
template_name = "general_user.html" 

def form_valid(self, form, *args, **kwargs): 
    user = GeneralUser() 
    user.username = form.clean_username() 
    user.email = form.cleaned_data['email'] 
    user.password = form.cleaned_data['password1'] 
    user.gender = form.cleaned_data['gender'] 
    user.date_of_birth = form.cleaned_data['date_of_birth'] 
    user.is_active = True 
    user.is_general_user = True 
    user.save() 
    title = "Welcome to something" 
    content = "Thank you for using our system." 
    send_mail(title, content, settings.EMAIL_HOST_USER, [user.email], fail_silently=True) 

    return redirect("home_question") 

Пользователь создан успешно. Когда я вижу от администратора, пользователь создается. Но когда я вхожу в систему, он говорит, что имя пользователя и пароль не совпадают.

Но когда я создаю пользователя от администратора и входа в систему, он вошел в систему без каких-либо ошибок. Я не знаю, что случилось. Я использую пользовательскую модель.

В стороне администратора я делаю пользователя is_active и is_general_user равным true. Я думаю, что если пользователь, созданный из администратора, может войти в систему, тогда пользователь, созданный из представления, также должен войти в систему.

Что здесь не так? Где я делаю ошибку?

ответ

2

Вы правильно переопределили метод сохранения формы, чтобы установить хешированный пароль через user.set_password(). Но вы никогда не называете это сохранением из своего представления: вместо этого вы создаете экземпляр генератора общего пользования непосредственно в методе form_valid вида, и там вы устанавливаете пароль непосредственно из cleaned_data, поэтому он не хешируется.

Удалить этот экземпляр с точки зрения, и вызвать супер метод (который вызывает form.save()) вместо:

def form_valid(self, form, *args, **kwargs): 
    response = super(GeneralUserCreateView, self).form_valid(form, *args, **kwargs) 
    user = self.object 
    title = "Welcome to something" 
    content = "Thank you for using our system." 
    send_mail(title, content, settings.EMAIL_HOST_USER, [user.email], fail_silently=True) 
    return response 
+0

и что о том, чтобы is_active = True и is_general_user = True ??? – gamer

+0

Почему бы не сделать это в форме save method? –

+0

да, это верно ... спасибо – gamer

Смежные вопросы