動機創建表單
我目前正在創建在Django待辦事項列表應用練習時意外Django的關鍵字參數。我現在想要做的是給「用戶」一次提交多個待辦事項的選項。爲此,我多次顯示錶單,然後逐個檢索每個表單中的項目。
嘗試&錯誤
這裏是有問題的形式:
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>
啊,難怪我找不到任何例子,其中一個形式是從關鍵字參數創建。因爲我可以在模型和請求中使用關鍵字參數。POST是一個類似於字典的對象,我只是猜測我可以做同樣的事情。 我的確瞭解了ModelForm,但是我的模型有很多我不想顯示的字段,我不確定是否可以選擇不經過太多工作而不顯示它們。 無論如何,謝謝你的迴應。 :) – 2012-07-09 20:03:01
您可以使用modelform的內部Meta類中的'fields'選項來指定表單上您想要的字段。 – 2012-07-09 20:07:10