2017-05-02 9 views
1

私は単純なフォームを持っており、ユーザーがフォーム上で何か間違っているときはいつでも、私はDjangoで検証エラーを起こしたいと思います。問題は私がそれを設定したことですが、フォームが間違った値で提出されたときに、それが通過します。なぜそれが起こっているのだろうと私はそれを避けることができますか?なぜ私のDjangoフォームでエラーが発生していないのですか?

<form id="ask-project" method="post" action="{% url 'ask-project' %}"> 
    {% csrf_token %} 

    <input required="required" class="form-control form-text required" id="prenom" name="prenom" type="text"> 

    <button class="btn btn-default submit">Submit</button> 
</form> 

views.py:

def askProject(request): 
    if request.method == 'POST': 
     form = AskProjectForm(request.POST) 
     if form.is_valid(): 
      save_it = form.save(commit=False) 
      save_it.save() 
      return redirect('/merci/') #success 

forms.py:

class AskProjectForm(forms.ModelForm): 
    class Meta: 
     model = AskProject 
     fields = ['prenom'] 

    def clean_prenom(self): 
     prenom = self.cleaned_data['prenom'] 
     if len(prenom) < 3: 
      raise ValidationError('Votre prénom doit etre plus long que 1 caractère.') 
     return prenom 

アムここ

は、HTML形式であります私は何か間違っている?

+0

間違ったデータがdbに保存されるのですか?エラーがテンプレートに表示されず、データが保存されないということだけですか? –

+0

データはまだdbに保存されていますが、エラーは表示されません – Lindow

答えて

1

使用しているパターンでは、この種の問題は避けられず、その日の順序です。最初のことは、あなたが行っているように手動でフォームをレンダリングしないことです。これは、ユーザーが無効なデータを入力したときにフィードバックを表示していないことを意味します。ここで説明するよう{{ form }}{{ form.as_table }}などを使用して、またはすべての情報のフィールドをレンダリング考えてみましょう:https://docs.djangoproject.com/en/1.11/topics/forms/#rendering-fields-manually

第二の問題は、フォームが送信されたときあなたは関係なく、それが有効だかどうかの、リダイレクトされていることです。推奨されるパターンは、フォームが有効な場合にのみリダイレクトすることです。したがって、最初の段階で提案を適用しても、依然として必要なフィードバックは得られません。マニュアルで提案されているようにフォームを実装することを検討してください。ストレートコピー過去には、(それが集計した場合、文字列と、それの長さの両方を見て印刷するあなたのきれいな方法でprint文を追加し、

if request.method == 'POST': 
    # create a form instance and populate it with data from the request: 
    form = NameForm(request.POST) 
    # check whether it's valid: 
    if form.is_valid(): 
     # process the data in form.cleaned_data as required 
     # ... 
     # redirect to a new URL: 
     return HttpResponseRedirect('/thanks/') 

# if a GET (or any other method) we'll create a blank form 
else: 
    form = NameForm() 

return render(request, 'name.html', {'form': form}) 

最後に、フォームの検証が動作しない理由の具体的なケースになってを次のまたはあなたのメソッドが呼び出される場合)

+0

私はこれをこのようにしていましたが、クラス、プレースホルダ、ラベルなどを扱うウィジェットを使用するのは面倒だったので、html – Lindow

+0

あなたは誤解をおかけして申し訳ありませんが、djangoフォーム。確かにあなたがやろうとしているものよりずっと簡単です。それは簡単にするために発明されました:) – e4c5

関連する問題