2016-10-27 23 views
0

私はDjango adminの外でDjango Webアプリケーションのホームページを作成しています。ホームページに、非常に単純なModelFormを用意して、提出するとデータベースに書き込むようにしたいと思います。/home /のAttributeError: 'ActionCodeForm'オブジェクトに 'is_bound'属性がありません

現在/ home /に次のエラーが表示され、解決方法がわかりません。

はAttributeErrorホーム/ ATは/「ActionCodeForm」オブジェクトは、私が結合および非結合フォームについて知っているとドキュメントを読んだことが何の属性 「is_bound」

を持っていませんが、私は実際に実装する方法がわかりませんそれら。ここで

は私のモデルである:ここでは

class ActionCode(models.Model): 
    action_code = models.CharField(blank=False, max_length=10, 
            verbose_name="Action Code") 

は私ModelForm次のとおりです。ここで

class ActionCodeForm(ModelForm): 
    class Meta: 
     model = ActionCode 
     fields = ('action_code',) 

    def __init__(self, *args, **kwargs): 
     super(ActionCodeForm).__init__(*args, **kwargs) 

が私の見解です:

def action_code_form(request): 
    if request.method == 'GET': 
     form = ActionCodeForm() 
    else: 
     form = ActionCodeForm(request.POST) 
    if form.is_valid(): 
     action_code = form.cleaned_data['action_code'] 
     form.save() 
    else: 
     form = ActionCodeForm() 
    return render('action_code_form.html', {'form': form}, 
        context_instance=RequestContext(request)) 

そして、ここでは私のテンプレート、action_code_form.htmlです:

<form method="post" action=""> 
{% csrf_token %} 
<table> 
{{ form }} 
</table> 
<input type="submit" value="Submit"/> 
</form> 

そしてurls.py

from home.views import action_code_form 

urlpatterns = [ 
    url(r'^home/', action_code_form, name="home"), 
] 
+0

関連性があるのか​​、 'super(ActionCodeForm)'ではなく 'super(ActionCodeForm、self)'でなければなりません。 – knbk

+0

これは、フォームがまったく使用されていないことを意味します。なぜなら、これはTypeErrorだからです。 –

答えて

1

あなたは方法がPOSTある場合にのみ、フォームが有効であるかどうかを確認する必要があります。また、render()の最初のパラメータがなければなりませんrequest

次のようにあなたのビューは次のようになります。あなたはモデルフォームで__init__()をオーバーライドする必要がある場合は、その後、あなたはsuper()の2番目のパラメータとしてselfを追加する必要があります

def action_code_form(request): 
    form = ActionCodeForm() 
    if request.method == 'POST': 
     form = ActionCodeForm(request.POST) 
     if form.is_valid(): 
      action_code = form.cleaned_data['action_code'] 
      form.save() 
    return render(request, 'action_code_form.html', {'form': form}) 

(フォームに追加したい特定の動作がない場合は、次の2行を保持する必要はありません)。

def __init__(self, *args, **kwargs): 
    super(ActionCodeForm, self).__init__(*args, **kwargs) 
+1

しかし、本当に、 '__init__'をすべてオーバーライドする必要はありません。もしあなたがしようとしているのは、スーパークラスメソッドを呼び出すことだけです。 –

+0

@DanielRosemanフォームの初期化やそのようなカスタムビヘイビアを追加したいと思っていました。 – ettanany

+0

これを明確にするために私の答えを編集しました。ありがとう@DanielRoseman – ettanany

関連する問題