动态表单抱怨“步数”作为意外的关键字参数

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 的自定义表单集

PHP / PDO动态绑定值(无效的参数计数错误)

动态生成的表单无法正常工作

得到了一个意外的关键字参数“my_id”(动态 URL 路由)

Zeppelin 动态表单:如何将变量传递给动态表单——或者——重用动态表单

JPA表单动态传参