Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中提交后如何清除基于类的视图中的表单字段_Python_Django_Python 3.x_Django Views_Reset Password - Fatal编程技术网

Python 在Django中提交后如何清除基于类的视图中的表单字段

Python 在Django中提交后如何清除基于类的视图中的表单字段,python,django,python-3.x,django-views,reset-password,Python,Django,Python 3.x,Django Views,Reset Password,我在Django项目中使用基于类的视图重置密码。我的表单只有一个字段,用户可以在其中写入电子邮件地址或用户名。成功提交后,用户可以在同一页面中看到成功消息。我的问题是,提交后,我会看到空字段,但同时我可以通过单击按钮再次发送数据成功提交后如何清除表单字段?我有点困惑 视图.py class PasswordResetRequestView(FormView): template_name = "registration/password_reset.html" success_u

我在Django项目中使用基于类的视图重置密码。我的表单只有一个字段,用户可以在其中写入电子邮件地址或用户名。成功提交后,用户可以在同一页面中看到成功消息。我的问题是,提交后,我会看到空字段,但同时我可以通过单击按钮再次发送数据成功提交后如何清除表单字段?我有点困惑

视图.py

class PasswordResetRequestView(FormView):
    template_name = "registration/password_reset.html"
    success_url = '/account/password_reset'
    form_class = PasswordResetRequestForm

    @staticmethod
    def validate_email_address(email):
        try:
            validate_email(email)
            return True
        except ValidationError:
            return False

    def post(self, request, *args, **kwargs):
        global data
        form = self.form_class(request.POST)
        try:
            if form.is_valid():
                data = form.cleaned_data["email_or_username"]
            if self.validate_email_address(data) is True:
                associated_users = User.objects.filter(Q(email=data) | Q(username=data))
                if associated_users.exists():
                    for user in associated_users:
                        c = {
                            'email': user.email,
                            'domain': request.META['HTTP_HOST'],
                            'site_name': 'your site',
                            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                            'user': user,
                            'token': default_token_generator.make_token(user),
                            'protocol': 'http',
                        }
                        subject_template_name = 'registration/password_reset_subject.txt'
                        email_template_name = 'registration/password_reset_email.html'
                        subject = loader.render_to_string(subject_template_name, c)
                        subject = ''.join(subject.splitlines())
                        email = loader.render_to_string(email_template_name, c)
                        send_mail(subject, email, DEFAULT_FROM_EMAIL, [user.email], fail_silently=False)
                    result = self.form_valid(form)
                    messages.success(request, 'An email has been sent to ' +
                                     data + ". Please check its inbox to continue reseting password.")
                    return result
                result = self.form_invalid(form)
                messages.error(request, 'No user is associated with this email address')
                return result
            else:
                associated_users = User.objects.filter(username=data)
                if associated_users.exists():
                    for user in associated_users:
                        c = {
                            'email': user.email,
                            'domain': 'example.info',
                            'site_name': 'example',
                            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                            'user': user,
                            'token': default_token_generator.make_token(user),
                            'protocol': 'http',
                        }
                        subject_template_name = 'registration/password_reset_subject.txt'
                        email_template_name = 'registration/password_reset_email.html'
                        subject = loader.render_to_string(subject_template_name, c)
                        # Email subject *must not* contain newlines
                        subject = ''.join(subject.splitlines())
                        email = loader.render_to_string(email_template_name, c)
                        send_mail(subject, email, DEFAULT_FROM_EMAIL, [user.email], fail_silently=False)
                    result = self.form_valid(form)
                    messages.success(request, 'Email has been sent to ' +
                                     data + "'s email address. Please check its inbox to continue reseting password.")
                    return result
                result = self.form_invalid(form)
                messages.error(request, _('This username does not exist in the system.'))
                return result
        except Exception as e:
            print(e)
        return self.form_invalid(form)

首先,永远不要使用全局变量

其次,您可以将post逻辑放入
form.save()
方法中。IMO its在这方面更为合适,它接近于
Django
在其内部所做的事情

这就是您的
表单
类的外观:

class PasswordResetRequestForm(forms.Form):
    #We are not using EmailField on purpose
    #because you want to treat it
    #as a username if its not an email
    email = forms.CharField(required=True)

    def __init__(self, *args, **kwargs):
        #For sending emails we are gonna need the request.
        request = kwargs.pop('request')
        super(PasswordResetRequestForm, self).__init__(*args, **kwargs)

    def clean_email(self):
        #You can add form error here if no user exists
        email = self.cleaned_data['email']
        users = User.objects.filter(Q(email=email)|Q(username=email))
        if not users.exists():
            self.add_error('email', 'No associated account found')

    def send_email(self, user):
        c = {
            'email': user.email,
            'domain': self.request.META['HTTP_HOST'],
            'site_name': 'your site',
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'user': user,
            'token': default_token_generator.make_token(user),
            'protocol': 'http',
        }
        subject_template_name = 'registration/password_reset_subject.txt'
        email_template_name = 'registration/password_reset_email.html'
        subject = loader.render_to_string(subject_template_name, c)
        subject = ''.join(subject.splitlines())
        email = loader.render_to_string(email_template_name, c)
        send_mail(subject, email, DEFAULT_FROM_EMAIL, [user.email], fail_silently=False)

    def save(self):
        email = self.cleaned_data['email']
        users = User.objects.filter(Q(email=email)|Q(username=email))

        for user in users:
            self.send_email(user)

        messages.success(self.request, """An email has been sent to %s. 
            Please check its inbox to continue reseting password.""" % email
        )
现在在
视图中
只需将
请求
作为
form.kwarg
发送,并在`form.waid()有效时调用
form.save()


首先,永远不要使用全局变量

其次,您可以将post逻辑放入
form.save()
方法中。IMO its在这方面更为合适,它接近于
Django
在其内部所做的事情

这就是您的
表单
类的外观:

class PasswordResetRequestForm(forms.Form):
    #We are not using EmailField on purpose
    #because you want to treat it
    #as a username if its not an email
    email = forms.CharField(required=True)

    def __init__(self, *args, **kwargs):
        #For sending emails we are gonna need the request.
        request = kwargs.pop('request')
        super(PasswordResetRequestForm, self).__init__(*args, **kwargs)

    def clean_email(self):
        #You can add form error here if no user exists
        email = self.cleaned_data['email']
        users = User.objects.filter(Q(email=email)|Q(username=email))
        if not users.exists():
            self.add_error('email', 'No associated account found')

    def send_email(self, user):
        c = {
            'email': user.email,
            'domain': self.request.META['HTTP_HOST'],
            'site_name': 'your site',
            'uid': urlsafe_base64_encode(force_bytes(user.pk)),
            'user': user,
            'token': default_token_generator.make_token(user),
            'protocol': 'http',
        }
        subject_template_name = 'registration/password_reset_subject.txt'
        email_template_name = 'registration/password_reset_email.html'
        subject = loader.render_to_string(subject_template_name, c)
        subject = ''.join(subject.splitlines())
        email = loader.render_to_string(email_template_name, c)
        send_mail(subject, email, DEFAULT_FROM_EMAIL, [user.email], fail_silently=False)

    def save(self):
        email = self.cleaned_data['email']
        users = User.objects.filter(Q(email=email)|Q(username=email))

        for user in users:
            self.send_email(user)

        messages.success(self.request, """An email has been sent to %s. 
            Please check its inbox to continue reseting password.""" % email
        )
现在在
视图中
只需将
请求
作为
form.kwarg
发送,并在`form.waid()有效时调用
form.save()


你是说提交空白表单不会引起错误?和/或你是说如果成功,你想将其重定向到另一个页面?@luke\u aus没有错误,我不想重定向。我在同一页中看到的成功消息。在成功提交后,您可以一次又一次地发送数据,但字段(空字段)中没有数据。那不好。这就是为什么我想在成功提交后清理表单字段。我想我需要再次在某个地方初始化form
form=self.form\u类(request.POST)
,但有点混乱。你认为呢?你必须在发帖后重定向。如果愿意,可以重定向回同一页,但必须重定向。而且您绝对不能使用全局变量,尤其是不要将表单数据保存在全局变量中@谢谢你的回答。正如你们所说,问题在于全球价值。现在可以了。你是说提交空白表单不会引起错误?和/或你是说如果成功,你想将它们重定向到另一个页面?@luke_aus没有错误,我不想重定向。我在同一页中看到的成功消息。在成功提交后,您可以一次又一次地发送数据,但字段(空字段)中没有数据。那不好。这就是为什么我想在成功提交后清理表单字段。我想我需要再次在某个地方初始化form
form=self.form\u类(request.POST)
,但有点混乱。你认为呢?你必须在发帖后重定向。如果愿意,可以重定向回同一页,但必须重定向。而且您绝对不能使用全局变量,尤其是不要将表单数据保存在全局变量中@谢谢你的回答。正如你们所说,问题在于全球价值。现在很好用。