首页 > 解决方案 > 为什么 form.is_valid() 总是需要返回字段?

问题描述

我不知道为什么我的表单在提交后总是返回需要电话,我被这个问题困扰了大约一个小时:(,我看到很多文章和问题已经被问到但无济于事。

视图.py

def register(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST or None)
        if form.is_valid():
            user = form.save(commit=False)
            telephone = number_prettify(form.cleaned_data.get('telephone'))
            user.phone = telephone
            raw_password = form.cleaned_data.get('password1')
            user.save()
            user = authenticate(phone=user.phone, password=raw_password)
            auth_login(request, user)
            return redirect('/')
    else:
        form = SignUpForm()
    return render(request, 'register.html', {'form': form})

这是我的forms.py

from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

# from .models import Client

User = get_user_model()

class SignUpForm(UserCreationForm):
    telephone = forms.CharField(label='Номер телефона', help_text='Required. Inform a valid phone number.', 
                    widget=forms.TextInput(attrs={'placeholder': '___-__-__-__','class':"uk-input phone_us"}))

    password1 = forms.CharField(label='Пароль',widget=forms.PasswordInput())
    password2 = forms.CharField(label='Повторите пароль',widget=forms.PasswordInput())

    agree_1 = forms.BooleanField()
    agree_2 = forms.BooleanField()

    def clean(self):
        if not self.cleaned_data['agree_1']:
            raise forms.ValidateError('You have to agree to out privacy')

    class Meta:
        model = User
        fields = ('phone',)

这也是models.py

class Client(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(null=True, blank=True, unique=True)
    phone = models.CharField(max_length=18,unique=True)
    joined = models.DateTimeField(auto_now_add=True)
    password = models.CharField(default='', null=False, max_length=255)

    USERNAME_FIELD = 'phone'

    class Meta:
        db_table = 'client'
        unique_together = ('phone',)

我的register.html模板:

<div class="uk-margin">
    <label> 
        <div class="uk-margin-small-bottom">{{form.telephone.label}} <span>*</span></div>
        {{form.telephone}}
    </label>
    </div>
    <div class="uk-margin">
    <label> 
        <div class="uk-margin-small-bottom">{{form.password1.label}} <span>*</span></div>
        {{form.password1|add_class:"uk-input"}}
    </label>
</div>

标签: djangodjango-forms

解决方案


您应该将字段从 更改telephonephone

class SignUpForm(UserCreationForm):
    phone = forms.CharField(label='Номер телефона', help_text='Required. Inform a valid phone number.', 
                    widget=forms.TextInput(attrs={'placeholder': '___-__-__-__','class':"uk-input phone_us"}))

    password1 = forms.CharField(label='Пароль',widget=forms.PasswordInput())
    password2 = forms.CharField(label='Повторите пароль',widget=forms.PasswordInput())

    agree_1 = forms.BooleanField()
    agree_2 = forms.BooleanField()

    def clean(self):
        if not self.cleaned_data['agree_1']:
            raise forms.ValidateError('You have to agree to out privacy')

    class Meta:
        model = User
        fields = ('phone',)

推荐阅读