我有一个表单,但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)
# ...
通过两个print语句,我可以看到这个请求。POST是目前与status
键填充,但形式。数据为空:
# request.POST
<QueryDict: {'csrfmiddlewaretoken': ['xxx...], 'status': ['1']}>
# form.data
<MultiValueDict: {}>
为什么是形式?数据没有被填充?
查看"excluded_choice
"的值。你定义了一个额外的位置参数的形式__init__
方法,这是拦截你试图传递给表单的数据。
我看到的最简单的解决方案是稍微修改一下表单__init__
方法。
def __init__(self, *args, excluded_choice=None, **kwargs):
或将数据作为关键字参数传递。
form = DPStatusForm(data=request.POST)
我认为第一种更可取,因为它保留了表单类的预期行为。