动态表单抱怨“步数”作为意外的关键字参数
Posted
技术标签:
【中文标题】动态表单抱怨“步数”作为意外的关键字参数【英文标题】:dynamic form complains about number of "steps" as an unexpected keyword argument 【发布时间】:2017-03-06 20:26:32 【问题描述】:我的表单允许在表单中提交多个“步骤”。这些步骤是通过 javascript 按下表单上的按钮来添加的。
问题在于 django 表单及其验证:
class TaskForm(forms.Form):
task_name = forms.CharField
step_number = forms.IntegerField(widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
step_fields = kwargs.get('step_number', 0)
super(TaskForm, self).__init__(*args, **kwargs)
self.fields['step_number'].initial = step_fields
for index in range(int(step_fields)):
self.fields['step_field_index'.format(index=index)] = forms.CharField()
这会在页面首次加载时创建带有任务名称作为唯一输入字段的表单。这是意料之中的。
我通过浏览器将步骤添加到我的任务中,这工作正常并且隐藏字段正在递增。
然后我提交,但我收到错误:
'task-app/create-task.html' 处的类型错误
__ init__() 得到了一个意外的关键字参数“step_number”
很明显,关键字参数来自views.py:
def add_task(request):
if request.user.is_authenticated():
if request.method == 'POST':
form = TaskForm(request.POST, step_number=request.POST.get('step_number'))
if form.is_valid():
# do something with the form
create_task(form)
messages.success(request, "The task form was valid")
return redirect('task-app:homepage')
else:
messages.warning(request, "The form is not valid")
return render(request, 'task-app/create-task.html', 'form':form)
else:
form = TaskForm()
return render(request, 'task-app/create-task.html', 'form':form)
【问题讨论】:
【参考方案1】:您是否忘记在调用 TaskForm 的超级初始化之前从 kwargs 中弹出 step_number
?
您应该来自 kwargs 的 pop
而不是 get
,否则表单会像您看到的那样抛出异常,因为 super().__init__
不需要额外的参数。
class TaskForm(forms.Form):
task_name = forms.CharField()
step_number = forms.IntegerField(widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
step_fields = kwargs.pop('step_number', 0)
super(TaskForm, self).__init__(*args, **kwargs)
self.fields['step_number'].initial = step_fields
for index in range(int(step_fields)):
self.fields['step_field_index'.format(index=index)] = forms.CharField()
【讨论】:
以上是关于动态表单抱怨“步数”作为意外的关键字参数的主要内容,如果未能解决你的问题,请参考以下文章
__init__() 得到了一个意外的关键字参数“instance”,其中包含用于 inlineformset_factory 的自定义表单集
得到了一个意外的关键字参数“my_id”(动态 URL 路由)