2014-10-13 7 views
2

Я пытаюсь создать нового пользователя в своем приложении Django, но ничего не происходит. Я использую пользовательскую модель auth. Часть кода, который я редактировал из документов. Почему сообщение об ошибке «Пользователи должны иметь адрес электронной почты» сообщается моделью, а не формами? Почему я не могу создать пользователя? Я не получаю никаких ошибок.Форма создания пользовательского пользователя Django

Моя модель:

from django.db import models 
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser 
from django.utils import timezone 


class MyUserManager(BaseUserManager): 

    def create_user(self, email, name, neighborhood, password=None): 

     if not email: 
      raise ValueError('Users must have an email address') 

     user = self.model(
      email=self.normalize_email(email), 
      name=name, 
      neighborhood=neighborhood 
     ) 

     user.set_password(password) 
     user.save(using=self._db) 

     return user 

    def create_superuser(self, email, name, neighborhood, password): 

     user = self.create_user(
      email=email, 
      name=name, 
      password=password, 
      neighborhood=neighborhood 
     ) 

     user.is_admin = True 
     user.save(using=self._db) 

     return user 


class MyUser(AbstractBaseUser): 

    name = models.CharField(max_length=255) 
    email = models.EmailField(max_length=255, unique=True) 
    created_at = models.DateTimeField(default=timezone.now, blank=True) 
    neighborhood = models.CharField(max_length=255) 
    consultant_id = models.IntegerField(null=True) 
    moip_id = models.IntegerField(null=True) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=False) 

    objects = MyUserManager() 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['name', 'neighborhood'] 

    def __str__(self): 
     return self.name 

    def get_full_name(self): 
     return self.name 

    def get_short_name(self): 
     return self.name 

    def has_perm(self, perm, obj=None): 
     return True 

    def has_module_perms(self, app_label): 
     return True 

    @property 
    def is_staff(self): 
     "Is the user a member of staff?" 
     # Simplest possible answer: All admins are staff 
     return self.is_admin 

Моя форма:

from django import forms 
from django.contrib.auth.forms import ReadOnlyPasswordHashField 

from dashboard.models import MyUser 


class UserCreationForm(forms.ModelForm): 

    password = forms.CharField(label='Senha', widget=forms.PasswordInput) 
    confirm_password = forms.CharField(label='Confirmar senha', widget=forms.PasswordInput) 

    class Meta: 

     model = MyUser 

     # Note - include all *required* MyUser fields here, 
     # but don't need to include password and confirm_password as they are 
     # already included since they are defined above. 
     fields = ('email', 'name', 'neighborhood',) 

    def clean(self): 

     cleaned_data = super(UserCreationForm, self).clean() 

     password = cleaned_data.get('password') 
     confirm_password = cleaned_data.get('confirm_password') 

     if password and confirm_password and password != confirm_password: 
      raise forms.ValidationError('As senhas nao batem.') 

    def save(self, commit=True): 

     user = super(UserCreationForm, self).save(commit=False) 

     user.set_password(self.cleaned_data['password']) 

     if commit: 
      user.save() 

     return user 

И мое мнение:

from django.shortcuts import render 

from frontend.forms import UserCreationForm 

# Create your views here. 

def register(request): 

    message = None 

    if request.method == 'POST': 

     form = UserCreationForm(request.POST) 

     if form.is_valid(): 

      form.save() 

    return render(request, 'frontend/register.html', {'message': message}) 
+0

где вы получите это сообщение об ошибке? –

+0

Какую версию django вы используете? Если он старше django 1.7, чистый метод формы должен возвращать очищенные данные – jproffitt

+0

Я использую 1.7. Сообщение об ошибке электронной почты (пользователи должны иметь адрес электронной почты) находится внутри MyUserManager, но почему это не внутри UserCreationForm? Когда я отправляю свою форму, ничего не происходит, просто обновите страницу. Я пытаюсь получить ошибку подтверждения пароля с помощью loop.non_field_errors, но сообщение не возвращается. –

ответ

0

До сих пор я знаю, вы не вызывают ошибку от формы, вы просто -

1) добавить e rror в нем, то он автоматически становится недействительным django и отправляется обратно с ошибкой, а также

2) поскольку вы переопределяете чистый метод, вы должны вернуть cleaned data. Таким образом, изменить чистый метод с этими деталями -

def clean(self): 
    cleaned_data = self.cleaned_data 

    password = cleaned_data.get('password') 
    confirm_password = cleaned_data.get('confirm_password') 

    if password and confirm_password and password != confirm_password: 
     #raise forms.ValidationError('As senhas nao batem.') => we do not raise error in form clean, instead we add it in validation error. 
     self.add_error('confirm_password', 'As senhas nao batem.') 
    return super(UserCreationForm, self).clean() # =>this line is IMPORTANT to not break the calling hierarchy 

немного короче -

def clean(self): 
    if self.cleaned_data['password'] != self.cleaned_data['confirm_password']: 
     self.add_error('confirm_password', 'Password & Confirm Password must match.') 

    return super().clean() 

Sine вы ничего не возвращает, то cleaned_data вашей формы пуста, и, таким образом, Джанго возвращает вас обратно к страницу формы без данных.

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