【问题标题】:Django request.POST not passed to form.dataDjango request.POST 未传递给 form.data
【发布时间】:2023-01-16 23:02:37
【问题描述】:

我有一个表单,但 request.POST 没有将数据传递到我的表单。即form.data 为空

我的表格

class DPStatusForm(forms.Form):
    status = forms.ChoiceField(label="")

    def __init__(self, excluded_choice=None, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if excluded_choice:
            status_choices = (
                (s.value, s.label)
                for s in DP.Status
                if s.value != excluded_choice
            )
        else:
            status_choices = ((s.value, s.label) for s in DP.Status)

        self.fields["status"].choices = status_choices

查看接收表单数据

def update_status(request, id):
    if request.method == "GET":
        return redirect("my_app:show_dp", id)

    p = get_object_or_404(DP, pk=id)
    form = DPStatusForm(request.POST)
    # debug statements
    print(request.POST)
    print(form.data)
    # ...

通过 2 条打印语句,我可以看到 request.POST 存在并填充了 status 键,但 form.data 为空:

# request.POST
<QueryDict: {'csrfmiddlewaretoken': ['xxx...], 'status': ['1']}>
# form.data
<MultiValueDict: {}>

为什么 form.data 没有被填充?

【问题讨论】:

    标签: django


    【解决方案1】:

    检查excluded_choice 的值。您正在为表单 __init__ 方法定义一个额外的位置参数,该方法正在拦截您试图传递给表单的数据。

    我看到的最简单的解决方案是稍微修改表单 __init__ 方法。

        def __init__(self, *args, excluded_choice=None, **kwargs):
    

    或将数据作为关键字参数传递。

    form = DPStatusForm(data=request.POST)
    

    我认为第一个更好,因为它保留了表单类的预期行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2012-09-18
      • 2018-09-04
      • 2019-11-25
      • 2021-01-28
      相关资源
      最近更新 更多