即使所有输入字段都已填写,“必填字段”仍会显示

时间:2020-11-12 11:11:44

标签: python django

请帮助。注册页面不断显示此字段为必填错误。我是初学者。谢谢

models.py

从django.db导入模型

从django.contrib.auth.models导入AbstractBaseUser,BaseUserManager

UserManager(BaseUserManager)类:

def create_user(self, email, username, full_name, password=None):
    if not email:
        raise ValueError("Users must have an email adress")
    if not username:
        raise ValueError("Users must have a username")
    if not password:
        raise ValueError("Users must have a password")
    if not full_name:
        raise ValueError("Users must have a name")
    user = self.model(
        email=self.normalize_email(email), # return lowercase
        username=username,
        full_name=full_name,
    )
    user.set_password(password) # users set password and change password
    user.full_name = full_name
    user.save(using=self._db)# using the default database in settings.py
    return user

def create_superuser(self, email, username, full_name, password=None):
    user = self.create_user(
        email=self.normalize_email(email),  # return lowercase
        username=username,
        full_name=full_name,
        password=password,
    )
    user.is_admin = True
    user.is_staff = True
    user.is_superuser = True
    user.save(using=self._db)  # using the default database in settings.py
    return user

类帐户(AbstractBaseUser):

email               = models.EmailField(
    verbose_name="email",
    max_length=60,
    unique=True,
)
username            = models.CharField(max_length=30, unique=True)
full_name           = models.CharField(max_length=30, blank=True, null=True)
date_joined         = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
last_login          = models.DateTimeField(verbose_name='last login', auto_now=True)
is_admin            = models.BooleanField(default=False)
is_active           = models.BooleanField(default=True)
is_staff            = models.BooleanField(default=False)
is_superuser        = models.BooleanField(default=False)
profile_image       = models.ImageField(max_length=255, null=True, blank=True, default=default_profile)
hide_email          = models.BooleanField(default=True)

USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username", "full_name"]

objects = UserManager()   # tie account to my custom user manager

def __str__(self):
    return self.username

# "Does the user have a specific permission?"
def has_perm(self, perm, obj=None):
    return True

# "Does the user have permissions to view the app `app_label`?"
def has_module_perms(self, app_label):
    return True

views.py

从django.shortcuts导入渲染,重定向

从django.contrib.auth导入登录,注销,身份验证

从account.forms导入RegistrationForm,AccountAuthenticationForm

def register_view(request):

user = request.user
if user.is_authenticated:
    return redirect('home')
if request.method == 'POST':
    form = RegistrationForm(request.POST)
    if form.is_valid():
        form.save()
        email = form.cleaned_data.get('email').lower()
        raw_password = form.cleaned_data.get('password1')
        user = authenticate(email=email, password=raw_password)
        login(request, user)
        return redirect('home')
else:
    form = RegistrationForm()
return render(request, 'account/register.html', {'registration_form': form})

def login_view(请求):

context = {}

user = request.user
if user.is_authenticated:
    return redirect("home")

if request.POST:
    form = AccountAuthenticationForm(request.POST)
    if form.is_valid():
        email = request.POST.get('email')
        password = request.POST.get('password')
        user = authenticate(request, email=email, password=password)
        if user is not None:
            login(request, user)
            return redirect("home")
else:
    form = AccountAuthenticationForm()
    context['login_form'] = form
return render(request, "account/login.html", context)

def logout_view(request): 注销(请求) 返回redirect(“ home”)

forms.py

从Django导入表格中

从django.contrib.auth导入get_user_model

从.models导入帐户

从django.contrib.auth导入身份验证

User = get_user_model()

RegistrationForm(forms.ModelForm)类:

full_name   = forms.CharField()
email       = forms.EmailField(max_length=60, help_text='Required. Add a valid email address.')
password1   = forms.CharField(widget=forms.PasswordInput)
password2   = forms.CharField(widget=forms.PasswordInput, label='Confirm password')


class Meta:
    model = Account
    fields = (
        'email',
        'username',
        'full_name',
        'password1',
        'password2',
    )

def save(self, commit=True):
    user = super(RegistrationForm, self).save(commit=False)
    user.email = self.cleaned_data.get('email')
    user.username = self.cleaned_data.get('username')
    user.full_name = self.cleaned_data.get('full_name')
    if commit:
        user.save()
    return user

def clean_email(self):
    email = self.cleaned_data.get('email')
    qs = User.objects.filter(email=email)
    if qs.exists():
        raise forms.ValidationError(f"Email {email} is already taken")
    return email

def clean_username(self):
    username = self.cleaned_data.get('username')
    qs = User.objects.filter(username=username)
    if qs.exists():
        raise forms.ValidationError(f"Username {username} is already taken")
    return username

def clean(self):
    data = self.cleaned_data
    password1 = self.cleaned_data.get('password1')
    password2 = self.cleaned_data.get('password2')
    if password2 != password1:
        raise forms.ValidationError("Passwords must match")
    return data

AccountAuthenticationForm(forms.ModelForm)类:

password = forms.CharField(label='Password', widget=forms.PasswordInput)

class Meta:
    model = Account
    fields = ('email', 'password')

def clean(self):
    if self.is_valid():
        email = self.cleaned_data.get('email')
        password = self.cleaned_data.get('password')
    if not authenticate(email=email, password=password):
        raise forms.ValidationError("Incorrect username or password")

2 个答案:

答案 0 :(得分:0)

问题的原因可能是由于username字段和email字段被一个代替了另一个。

在上述代码中找到的示例:

USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["username", "full_name"]

可以通过验证并解决以下错误来解决该问题:使用电子邮件字段代替用户名字段,反之亦然。

答案 1 :(得分:0)

很可能在您的字段 html id 和 name 中存在错误,因此表单验证将其注册为空值