Django通过上下文显示formfields的动态方式

时间:2017-01-11 11:59:26

标签: javascript python django forms django-forms

对于Django来说,我是一个很长时间的初学者,如果这个问题过于宽泛,错位甚至是显而易见,那么对不起。

我在这里阅读了几篇帖子,以及一些例子,例如thisthis,但没有一篇描述了我需要做的事情。

想象一下,我有以下表单提交项目,我希望显示字段并在客户端表单中添加或显示它们,但仅限于表单中满足某些输入条件 - 例如。如果要提交的项目是一系列项目(is_project_series)的一部分,那么我可能想要显示一些表单字段,例如。系列中应该有多少个项目或它们应该如何命名或编号,甚至可以根据这些动态字段的输入生成进一步的动态输入 - 否则默认情况下项目表单可能只显示'projectname'的最简单字段,'project_format'等以及'is_project_series'的布尔值,它会在True时动态显示隐藏字段。

我想知道Django熟练的用户如何才能获得这种功能,以及是否有任何内置工具可以支持它?或者如果它只是javascript和隐藏字段的问题。

如果有人可以根据这样的简单模型/表格提供示例。

Models.py

class Project(models.Model):
    projectname = models.CharField(max_length=100)

Forms.py

class ProjectCreateForm(ModelForm):
    ''' Project CREATE form'''
    project_format = forms.TypedChoiceField(
        label = "Project Format",
        choices = ((1, "HD"), (0, "SD")),
        coerce = lambda x: bool(int(x)),
        widget = forms.RadioSelect,
        initial = '1',
        required = True,)

    is_project_series = forms.BooleanField(widget=forms.CheckboxInput, default=False)

    *A number of extra form fields here based on if 'is_project_series' is defined as True or False *

    def __init__(self, *args, **kwargs):
        super(ProjectCreateForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper(self)
        self.helper.add_input(Submit('project_submit', 'Done')) # class and label
        self.fields['programme'] = ProgrammeChoiceFieldLong(Redaktion.objects.all().order_by('usercode').exclude(active=False))

    class Meta:
        model = Project
        fields = ['programme','projectname','is_project_series']

1 个答案:

答案 0 :(得分:0)

将当前模型实例传递给 init ,以便您可以在那里执行if语句:

def __init__(self, instance=None, *args, **kwargs):
    super(ProjectCreateForm, self).__init__(instance=instance, *args, **kwargs)
    if instance and instance.is_project_series:
        # do stuff