0

動機

現在、練習用にdjangoでto-doリストアプリを作成しています。私が今やろうとしているのは、一度に複数の To Do アイテムを送信するオプションを「ユーザー」に与えることです。そのために、フォームを複数回表示してから、各フォームから個別にアイテムを取得します。

試行とエラー

問題のフォームは次のとおりです。

class AddItemForm(forms.Form):
    name = forms.CharField(max_length=60, label='Item Name')
    priority = forms.IntegerField(required=False,
            widget=forms.Select(choices=Item.PRIORITY))
    due_date = forms.DateTimeField(required=False, label='Due Date')

ただし、キーワード引数を使用してフォームを作成しようとすると (対象の行は for ループにあります):

def add_item(request):
    if request.method == 'POST':
        r = request.POST
        names = r.getlist('name')
        priorities = r.getlist('priority')
        due_dates = r.getlist('due_date')
        for i in xrange(len(names)):
            form = AddItemForm(
                       name=names[i],
                       priority=priorities[i],
                       due_date=due_dates[i],
                   )
            if form.is_valid():
                item = form.cleaned_data
                Item.objects.create(**item) 
        return HttpResponseRedirect('/todo')

    form = AddItemForm()
    try:
        num_items = xrange(int(request.GET.get('n', 1)))
    except ValueError:
        num_items = xrange(1)
    return render(request, 'add_item.html', 
            {'form': form, 'num_items': num_items})

次のエラー メッセージが表示されます。

Exception Type: TypeError
Exception Value:    
__init__() got an unexpected keyword argument 'priority'

AddItemForm のフィールドとして優先度があるため、何が起こっているのかわかりません。

HTML

役立つ場合は、テンプレート html を次に示します。

<!DOCTYPE html>
<html>
  <head> <title>Add item</title> </head>
  <body>
    <form method="post">{% csrf_token %}
      {% for i in num_items %}
        <div>{{ form }}</div>
      {% endfor %}
      <input type="submit">
    </form>

    <br><br>
    <form action="/todo" method="get">
      <input type="submit" value="Go back to To-Do List">
    </form>
  </body>
</html>
4

2 に答える 2

1

まあ、それはフォームの仕組みではありません。最初に POST 引数を処理することは想定されておらず、個々のフィールドのデータをそのような引数として渡すことはできません。request.POSTフォームのインスタンス化をそのまま渡すだけです。

複数の同じフォームのセットを行う方法は、フォームセットを使用することです。その後、フォームセットのインスタンス化に POST データを直接渡し、検証済みのフォームを取得できます。

フォームはモデル インスタンスの作成に使用されているため、モデルフォーム(および同じページのモデル フォームセット) の使用を検討することをお勧めします。

于 2012-07-09T19:58:25.393 に答える
0

Django フォーム。init () は「initial」キーワード引数を受け入れます。次の方法でフォームの初期値を設定できます。

form = AddItemForm(initial = {
                      'name':names[i],
                      'priority':priorities[i],
                      'due_date':due_dates[i],
                   }
               )
于 2013-09-22T08:10:42.767 に答える