使用视图动态更新 ModelForm 的 Meta class 字段

Dynamically update ModelForm's Meta class fields using views

我在检查视图中的某些条件后尝试创建一个动态表单,但我不确定如何处理它。我如何从我的视图中填充表单 Meta class 中的字段属性?

下面是我的 views.py 和我的 forms.py 文件。

views.py

如何根据我的视图填充 forms.py 中的字段列表?

    from django.shortcuts import render, get_object_or_404
    from django.http import HttpResponse
    from django import forms

    from .models import Master, Label, Assosiative
    from .forms import LabelForm, MzasterForm, AssosiativeForm

    def master(request,pk):
        associate = get_object_or_404(Assosiative, pk=pk)
        form = MasterForm(request.POST or None)
        if associate.short_text1 == 1:
            form.fields['short_text1'] = forms.CharField(label='Short text 1')
        if associate.short_text2 == 1:
            form.fields['short_text2'] = forms.CharField(label='Short text 2')
        if associate.short_text3 == 1:
            form.fields['short_text3'] = forms.CharField(label='Short text 3')
        if associate.short_text4 == 1:
            form.fields['short_text4'] = forms.CharField(label='Short text 4')
        if associate.num_field1 == 1:
            form.fields['num_field1'] = forms.CharField(label='Number field 1')
        if associate.num_field2 == 1:
            form.fields['num_field2'] = forms.CharField(label='Number field 2')
        if form.is_valid():
            try:
                short_text1 = form.cleaned_data['short_text1']
                short_text2 = form.cleaned_data['short_text2']
                short_text3 = form.cleaned_data['short_text3']
                short_text4 = form.cleaned_data['short_text4']
                num_field1 = form.cleaned_data['num_field1']
                num_field2 = form.cleaned_data['num_field2']
                form.save()
            except Exception, ex:
        return HttpResponse("Error %s" %str(ex))
        return render(request, 'master.html', {'form':form,}) 

forms.py

我不知道该怎么做才能根据我的观点填充字段

    def masterForm(fields_list, *args, **kwargs):
        class MasterForm(forms.ModelForm):
            class Meta:
                model = Master
                fields = fields_list
            def __init__(self):
                super(MasterForm, self).__init__(*args, **kwargs)
         return MasterForm()
    joke = masterForm(('short_text1',))

this question 一样,您可以定义一个创建表单 class 的方法。查看您的视图,您似乎是根据 associate 一个一个地创建字段,而不是创建一个字段列表。因此,我会使用 associate 作为您的 get_form_class 方法的参数。

def get_form_class(fields_list):
    class MasterForm(ModelForm):
        class Meta:
            model = Master
            fields = fields_list
        ...
    return MasterForm

然后,在您看来,使用get_form动态创建表单class,然后实例化它。

def master(request, pk):
    associate = get_object_or_404(Assosiative, pk=pk)
    fields_list = []
    if associate.short_text1 == 1:
        fields_list.append('short_text1')
    if associate.short_text2 == 1:
        fields_list.append('short_text2')
    MasterForm = get_form_class(fields_list)
    form = MasterForm(request.POST or None)
    if form.is_valid():
        ...

检查一些条件后动态创建表单

views.py

    def master(request, pk):
        associate = get_object_or_404(Assosiative, pk=pk)
        MasterForm = get_form_class(associate)
        form = MasterForm(request.POST or None)
        if form.is_valid():
            form.save()
            messages.add_message(request, messages.INFO, 'Your Form has been posted successfully')
            return HttpResponseRedirect('/')
        return render(request, 'master.html', locals())

将表单字段动态添加到字段列表 class Meta in forms.py

    def get_form_class(associate, *args, **kwargs):
        class MasterForm(forms.ModelForm):
            def __init__(self, *args, **kwargs):
                super(MasterForm,self).__init__(*args, **kwargs)
            class Meta:
                model = Master
                fields = [] #initialize an empty fields list
                # Append items to the fields list after checking some condition
                if associate.short_text1 == 1:
                    fields.append('short_text1')
                if associate.short_text2 == 1:
                    fields.append('short_text2')
                if associate.short_text3 == 1:
                    fields.append('short_text3')
                if associate.short_text4 == 1:
                    fields.append('short_text4')
                if associate.num_field1 == 1:
                    fields.append('num_field1')
                if associate.num_field2 == 1:
                    fields.append('num_field2')            
         return MasterForm