我正在创建简单的动态form fields
,用户可以添加其表单字段,并且所有字段都与category
模型相关。我希望当用户选择名为category
的{{1}}并向他们显示与该车相关的car
时。
我的结构:
fields
我的问题是如何生成表单以及如何从class Category:
name = ...
class Field:
label = ...
category = ForeignKey(Category)
class FieldValue:
value = ...
field = ForeignKey(Field)
检索数据,因此可以将记录添加到form.cleaned_data
模型中。我创建了一个表单,并且可以正常使用FieldValue
进行渲染。我想从呈现的表单字段中检索数据。
我的表单:
__init__
我的观点:
class CategoryFieldsForm(forms.Form):
def __init__(self, category_id, *args, **kwargs):
super(CategoryFieldsForm, self).__init__(*args, **kwargs)
fields = Field.objects.filter(category_id=category_id)
for i in range(1, len(fields)):
for field in fields:
self.fields[field.slug] = forms.CharField()
def clean(self):
# how can i validate
def save(self):
print(self.cleaned_data)
# how can i save fields
当我提交表单def some_create_view(request, category_id):
if request.method == 'POST':
form = CategoryFieldsForm(category_id)
form.save()
form = CategoryFieldsForm(category_id)
return render(request, 'create.html', {'form': form})
时,没有显示属性CategoryFieldsForm
的对象。
答案 0 :(得分:1)
您需要使用POST数据实例化表单,然后调用form.is_valid()
才能访问form.cleaned_data
。
def some_create_view(request, category_id):
if request.method == 'POST':
form = CategoryFieldsForm(category_id, data=request.POST)
if form.is_valid():
form.save()
答案 1 :(得分:0)
您可以了解有关form.is_valid()here的更多信息。
Form实例具有is_valid()方法,该方法为其所有字段运行验证例程。调用此方法时,如果所有字段都包含有效数据,则它将:
1)返回True
2)将表单的数据放在其cleaned_data属性中。
def some_create_view(request, category_id):
if request.method == 'POST':
form = CategoryFieldsForm(category_id, request.POST)
if form.valid():
# you should be able to access the form cleaned data here
....
答案 2 :(得分:0)
感谢Daniel Roseman等。我在想的是更简单的错误。
if request.method == 'POST':
form = CategoryFieldsForm(category_id, request.POST)
if form.is_valid():
print(form)
else:
print(form.errors)
form = CategoryFieldsForm(category_id)
我只是忘记了将request.POST
传递给我的表单。