【问题标题】:Prevent form refresh on validation error django防止表单刷新验证错误django
【发布时间】:2019-03-11 13:57:15
【问题描述】:

我有一个继承自 ModelForm 的 RegisterForm 和继承自 FormView 的 RegisterView。如果每个字段数据都有效,则用户成功创建并被重定向到登录页面。但是如果出现验证错误,它会在该字段下方显示字段错误,并且表单会刷新并且所有字段数据都会丢失。如何避免表单刷新,使用户无需一次又一次地填写详细信息。

forms.py

class RegisterForm(forms.ModelForm, PasswordValidatorMixin):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField( label='Confirm password', widget=forms.PasswordInput)

    class Meta:
        model = UserModel
        fields = (
            'first_name',
            'last_name',
            'username',
            'password1',
            'password2',
            'current_email',
        )

    def __init__(self, social_email=None, social_fname=None, social_lname=None, 
        social_uname=None,*args, **kwargs):
        super(RegisterForm, self).__init__(*args, **kwargs)
        self.current_email = None
        self.social_email = social_email
        self.social_fname = social_fname
        self.social_lname = social_lname
        self.social_uname = social_uname

    def clean(self, *args, **kwargs):
        username = self.cleaned_data.get('username')
        self.current_email = self.cleaned_data.get('current_email')
        if self.social_email:
            self.current_email = self.social_email

        if not username:
            raise forms.ValidationError({"username":"Username can't be empty"})
        if not self.current_email:
            raise forms.ValidationError({"current_email":"Email can't be empty"})
        qs = UserModel.objects.filter(username=username)
        qs_email = UserModel.objects.filter(current_email=self.current_email)
        if qs.exists():
            raise forms.ValidationError({"username":"Username is already taken"})
        if qs_email.exists():
            raise forms.ValidationError({"current_email":"Email has already been registered"})
        return self.cleaned_data

    def save(self, commit=True):
        user = super().save(commit=False)
        current_email = self.cleaned_data.get('current_email')
        password = self.cleaned_data.get('password1')
        user.set_password(password)
        if self.social_email:
            user.is_active = True
        user.save()
        return user

views.py

class RegisterView(ContextMixin, FormView):
    form_class = RegisterForm
    template_name = 'accounts/register.html'
    title = 'Register'

    @method_decorator(sensitive_post_parameters('password'))
    @method_decorator(csrf_protect)
    @method_decorator(never_cache)
    def dispatch(self, *args, **kwargs):
        self.kwargs['social_email'] = SOCIAL_USER_EMAIL
        self.kwargs['social_fname'] = SOCIAL_USER_FNAME
        self.kwargs['social_lname'] = SOCIAL_USER_LNAME
        if SOCIAL_USER_EMAIL:
            self.kwargs['social_uname'] = SOCIAL_USER_EMAIL.split('@',1)[0]
        return super(RegisterView, self).dispatch(*args, **kwargs)

    # Passes view kwargs to html
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if SOCIAL_USER_EMAIL:
            context['social_email'] = self.kwargs['social_email']
            context['social_fname'] = self.kwargs['social_fname']
            context['social_lname'] = self.kwargs['social_lname']
            context['social_uname'] = self.kwargs['social_uname']
            # context['social_image'] = SOCIAL_USER_IMAGE
        return context

    # Passes view kwargs to form
    def get_form_kwargs(self):
        kwargs = super(RegisterView, self).get_form_kwargs()
        kwargs.update(self.kwargs)
        return kwargs

    def form_valid(self, form):
        form.save()
        if not self.kwargs['social_email']:
            return render(self.request, 'accounts/success.html', {
            'title':"You've registered successfully",
            'body':"You've successfully registered at antef! Please verify the link sent at " + 
            form.current_email
            })            

        return render(self.request, 'accounts/success.html', {
            'title':"You've registered successfully",
            'body':"You've successfully registered with your " + self.kwargs['social_email'] + " account."})

【问题讨论】:

    标签: django python-3.x django-forms


    【解决方案1】:

    首先,您不需要对空输入进行验证错误,只需在您的 forms.py 或模型中添加 required = True

    其次,您在验证错误后没有返回任何内容,这使您的表单在刷新后为空。

    您也可以分别查看邮箱和用户名,以便更好地使用,

    def clean_email(self):
         email = self.cleaned_data.get('email')
         if your_condition:
            raise forms.ValidationError()
         return email
    
    def clean_username(self):
         username = self.cleaned_data.get('username')
         if your_condition
             raise forms.ValidationError
         return username
    

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2016-03-20
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多