【问题标题】: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})

【问题讨论】:

    标签: django django-forms django-views


    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      相关资源
      最近更新 更多