2017-10-03 8 views
1

私はdjangoプロジェクトに取り組んでいます。登録時に特別割引を得るためにコードを送信することができます。ディスカウントコードのバリデーションはすでにうまく機能していますが、私は1つの美化面が欠けています。ユーザが無効なコードを送信した後、入力フィールドを空にしたい。つまり、提出後にdjangoでフォームフィールドデータを削除するには

def validate_code(value): 
    # check code for validity or raise ValidationError 

class CodeForm(forms.Form): 
    code = forms.CharField(validators=[validate_code]) 

# in my views.py 
def code_verification_view(request): 
    if request.method == 'POST': 
    form = CodeForm(request.POST) 
    if form.is_valid(): 
     # proceed with given code 
    else: 
     # modify form to return an empty html input for the code field 
     # this is where I'm stuck 
     form.fields['code'].value = '' 

    # ... render the form in a template 

最終結果は、入力フィールドが空白のフォームである必要がありますが、検証エラーが表示されます。この動作は、フォームの検証が失敗した場合にパスワード入力フィールドが空になる方法と似ているはずです。

EDIT:https://stackoverflow.com/a/46564834/8572938 は、私は、フォームの保護されたメンバーへのアクセスに依存しない適切な解決策をいただければと思います参照してください。私は非常にハック方法で、問題を解決しました。

+1

ここで問題を解決できた場合は、この投稿への回答を追加する必要があります。たとえば、その投稿にはリンクが付いていますが、嫌いです。 – geisterfurz007

答えて

0

私が働く方法を見つけましたしかし、それはかなり汚れています:

このように、私は保存されたエラーでクリーンなフォームを取得します。 それは仕事をしている間、それは明らかに醜いハックです。

+0

私の解決策を試しましたか? – Bestasttung

0

フォーム定義でフィールドの検証を行います。

class CodeForm(forms.Form): 
    code = forms.CharField(validators=[validate_code]) 

    def clean_code(self): 
     code = self.cleaned_data(code) 
     error = # some of your process 
     if error: 
      self.fields['code'] = None 
      raise forms.ValidationError('...') 
     else: 
      return code 

、代わりにあなたが他の何かをしたい、あなたのビューでelse部分を削除します。エラーのあるフォームだけを表示したい場合は、raise forms.ValidationErrorがそれを行います。

django形式では、clean_<field_name>を追加することで、好きなように各フィールドを制御できます。

詳細情報here

+0

エラーが発生した場合は、フォームにはユーザーが入力した値が保持されます。無効なコードが入力された場合、CharFieldのウィジェット内のテキストを消去したいと思います。 – spin

+0

self.fields ['code'] =なしのフィールド値をクリアすることができます – Bestasttung

+0

残念ながら、これは動作しません。 fields属性は、django Fieldオブジェクトのリストです。文字列を置くと後で例外がスローされます。 – spin

0

ちょうどあなたのテンプレートをレンダリングするフォームが有効でない場合、それは有効なプロセスであれば、それは場合は、エラーが表示されます、あなたのデータ

def code_verification_view(request): 
    if request.method == 'POST': 
    form = CodeForm(request.POST) 
    if form.is_valid(): 
     // process your data 
    else: 
     form.data['field'] = None 

    return render(request, template_name, {'form': form}) 
+0

エラーメッセージが表示されないようにするには、エラーがある場合は空の入力ボックスとエラーメッセージが必要です。 提案したコードは、ユーザーが入力した無効な文字列を保持します。 – spin

+0

これを試して、私は私の答えを更新しました。 @spin – Sagar

+0

すでにこれを試しました。残念ながら、この時点でform.dataは不変です – spin

関連する問題