2016-08-11 6 views
0

私のDjangoプロジェクトでのパスワードベースのビューを使用します。私のフォームには、ユーザーがそこにメールアドレスやユーザー名を書くことができるフィールドが1つしかありません。成功したサブミット後、ユーザーは同じページで成功メッセージを見ることができます。私の問題は、送信後に空欄が表示されますが、同時に、ボタンをクリックしてデータを送信することができます。 成功した送信後にフォームフィールドをクリアするには?私はちょっとやっかいです。Djangoでサブミットした後にクラスベースのビューでフォームフィールドをクリアする方法

views.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) 
+0

空白のフォームを送信してもエラーは発生しませんか? –

+0

、そして/または成功したら別のページにリダイレクトしたいと言っていますか? –

+0

@luke_ausエラーはなく、リダイレクトしたくありません。私は同じページに表示される成功メッセージです。成功した送信の直後に、データを何度も送信することができますが、フィールドにはデータはありません(空欄)。それは良いことではありません。そのために私はなぜsuccesfull submitの後にフォームフィールドをきれいにしたいのですか?私はフォーム 'form = self.form_class(request.POST)'をどこかで初期化する必要があると思いますが、やや難解です。どう思いますか? –

答えて

1

まず、決してグローバル変数を使用します。

第2に、投稿ロジックをform.save()メソッドに入れることができます。

あなただけ送信する必要が View
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 
     ) 

そして今:IMOのは、はるかに適切な存在とDjangoこれはあなたのFormクラスは次のように見ることができる方法ですそのPasswordResetForm

の内側にやっていることにその近くにありますrequestform.kwargとし、 `form.is_valid()があるときはform.save()を呼び出します。

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

    def get_form_kwargs(self, *args, **kwargs): 
     kwargs = super(PasswordResetRequestView, self).get_form_kwargs(*args, **kwargs) 
     kwargs['request'] = self.request 
     return kwargs 

    def form_valid(self, *args, **kwargs): 
     form = kwargs['form'] 
     form.save() 
     return super(PasswordResetRequestView, self).form_valid(*args, **kwargs) 
関連する問題