我有以下表格:
class SkuForm(forms.Form):
base_item = forms.ModelChoiceField(queryset=BaseItem.objects.none())
color_or_print = forms.ModelMultipleChoiceField(queryset=Color.objects.none())
material = forms.ModelMultipleChoiceField(queryset=Material.objects.none())
size_group = forms.ModelMultipleChoiceField(queryset=Size_Group.objects.none())
我的观点:
def sku_builder(request):
if request.method == "POST":
user = request.user
form = SkuForm(request.POST)
if form.is_valid():
base_item = form.cleaned_data['base_item']
colors = filter(lambda t: t[0] in form.cleaned_data['color_or_print'], form.fields['color_or_print'].choices)
materials = filter(lambda t: t[0] in form.cleaned_data['material'], form.fields['material'].choices)
size_groups = filter(lambda t: t[0] in form.cleaned_data['size_group'], form.fields['size_group'].choices)
return render(request, 'no_entiendo.html', {'colors': colors, })
else:
return HttpResponse("form is not valid")
user = request.user
form = SkuForm()
form.fields['base_item'].queryset = BaseItem.objects.filter(designer=user)
form.fields['color_or_print'].queryset = Color.objects.filter(designer=user)
form.fields['material'].queryset = Material.objects.filter(designer=user)
form.fields['size_group'].queryset = Size_Group.objects.filter(designer=user)
return render(request, 'Disenador/sku_builder.html', {'form': form,})
问题是我只收到“表单无效的消息”我不知道为什么它无效,因为表单只是由选项组成,所以没有拼写错误。此外,我没有从系统反馈调试,或者不知道在哪里搜索。
* form.is_valid之后发生的事情不是完整的代码
更新: 我放置了{{form.errors}}并得到了这个: color_or_print
Select a valid choice. 6 is not one of the available choices.
base_item
Select a valid choice. That choice is not one of the available choices.
size_group
Select a valid choice. 2 is not one of the available choices.
在size_group和color_or_print中,数字是pk(但只显示一个项目,2个被选中),不确定base_item中发生了什么。我应该通过:
提取值get_object_or_404 ?
我可以用base_item做什么?这是信息的图像 posted from the debug_toolbar
答案 0 :(得分:0)
尝试在模板中呈现{{form.errors}}
答案 1 :(得分:0)
如果表单无效,则需要使用表单呈现html,而不是发送HttpResponse
。
if form.is_valid():
# Do your operations on the data here
...
return render(request, 'no_entiendo.html', {'colors': colors, })
else:
return render(request, 'Disenador/sku_builder.html', {'form': form,})
此外,如果您使用模型选择字段,则定义查询集的理想位置在您的表单__init__
方法
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
self.fields['base_item'].queryset = BaseItem.objects.filter(designer=user)
# define more querysets here as you require
...
super(SkuForm, self).__init__(*args, **kwargs)
您可以在视图中更改查询集。但据我所知,这是一种覆盖你在表单中设置的内容的方法。通常应在__init__
中设置。