【问题标题】:Django dynamic way to display formfields by contextDjango动态方式按上下文显示表单域
【发布时间】:2017-05-26 05:10:27
【问题描述】:

我是 Django 的长期初学者,如果这个问题太宽泛、错位甚至明显,我很抱歉。

我已经阅读了这里的几篇文章,以及一些示例,例如 thisthis,但没有一个描述实现我需要做的事情。

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

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

如果有人可以提供基于诸如此类的简单模型/表格的示例。

模型.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']

【问题讨论】:

    标签: javascript python django forms django-forms


    【解决方案1】:

    当前模型实例被传递给 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
    

    【讨论】:

    • 是的,但 init 不是只在表单实例化时执行吗?所以我必须发送一个 is_project_series *arg 发布到表单的第一个实例。我想避免发回和转发到服务器并在表单中动态地完成所有操作。我会用这个 - jsfiddle.net/QAaHP/16
    猜你喜欢
    • 2019-05-02
    • 1970-01-01
    • 2013-02-14
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 2013-06-27
    • 1970-01-01
    相关资源
    最近更新 更多