Django表单如何从字段获取cleaned_data

时间:2018-08-28 09:25:53

标签: python django django-models django-forms

我正在创建简单的动态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的对象。

3 个答案:

答案 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传递给我的表单。