2011-02-14 17 views
3

をレンダリングしませんブラウザ。表示されるのは送信ボタンだけです。私のHTMLは次のようになります:Djangoのフォームは、私がforms.pyで次の形式を持っている

<html> 
<head> 
</head> 
<body> 
{% if contractForm.errors %} 
<p style="color: red;"> 
    Please correct the error{{ contractForm.errors|pluralize }} below. 
</p> 
{% endif %} 
<form method="POST" action="">  
    <table> 
     {{ contractForm.as_table }} 
    </table> 
    <input type="submit" value="Submit" /> 
</form> 
</body> 
</html> 

なぜフォームはレンダリングされませんか?


EDIT 私は、ユーザーが必要なカスタムクライアントフィールドを取り除く持っていると、それはまだ表示されません。これが助けになると思いました。 ので、フォームは、このクラスを使用することができます。

class ContractForm(forms.Form): 
    title = forms.CharField() 
    start_date = forms.DateField() 
    end_date = forms.DateField() 
    description = forms.CharField(widget=forms.Textarea) 
    client = forms.ModelChoiceField(queryset=Client.objects.all()) 
+0

ページでGETするだけでフォームが正常に機能しますか?また、冒頭であなたの認証チェックの代わりに、あなたのためにそれを行うlogin_requiredデコレータをチェックしてください。 – sdolan

+0

@sdolanいいえ影響はありません。 – Dean

答えて

0

ビュー内のフォームの名前を変更します。それは今のようになります

form = ContractForm(user=request.user) 

そしてそれは動作します。

2

forms.ModelChoiceFieldからqueryset引数は、クエリセットでなければなりません。読み込みする必要があります。

self.fields['client'] = forms.ModelChoiceField(queryset=Client.objects.filter(user=user)) 

そして、あなたは最初__init__()の方法でそれをオーバーライドする前に、あなたの形でそれを宣言する必要があります。

class ContractForm(forms.Form): 
    ... 
    client = forms.ModelChoiceField(queryset=Client.objects.all()) 
+0

問題は解決していません。 – Dean

+0

私の答えを編集しました。 – Arnaud

+0

まだ問題があります。 – Dean

2

かなりの数のものがクエリセットに加えて、間違ってここにありますArnaudが指摘する問題。

最初に、GETに応答してフォームをインスタンス化するときは、contractForm = ContractForm(user)を実行します。しかし、フォームのインスタンシエーションの最初のパラメータ(POSTで正しく行うように)は、投稿されたデータです。フォームの__init__シグネチャは変更されていません。

第2に、__init__自体では、userという変数を参照していますが、実際にはどこからでもその変数を取得していません。変数をどこからでも受け取らずに魔法のように参照することはできません。

ので、これらのエラーを修正するために、あなたは次のようにinitメソッドに変更する必要があります。

def __init__(self, *args, **kwargs): 
    user = kwargs.pop('user') 
    super(ContractForm, self).__init__(*args, **kwargs) 
    self.fields['client'].queryset=Client.objects.filter(user=user) 

をし、このようなビューでフォームをインスタンス化します。

contractForm = ContractForm(user=request.user) 

第三に、これではないがPOSTのセクションで有効であることを確認していないため、このフォームのエラーは表示されません。if contractForm.is_valid()をチェックする必要があります。最後にrender_to_responseにする必要があります。 1レベルをインデントしないでください)。

また、モデルを直接request.POSTに設定することで、フォームを持つ点全体を無視します。 Contractインスタンスを作成するには、contractForm.cleaned_dataの内容を使用する必要があります。

最後に、ModelFormがあなたのニーズをよりよく満たすかどうかを調べる必要があります。

+0

まだフォームをレンダリングしていません。 – Dean

関連する問題