2017-01-11 31 views
1

我非常喜欢用Django很长一段时间的初学者,所以对于这个问题如果太宽泛,放错位置甚至是显而易见的,我们都很抱歉。Django按上下文显示表单域的动态方式

我已经在这里看过几篇文章,还有一些例子,如thisthis,但没有一篇描述实现我需要做的事情。

想象一下,我有下面的表单来提交一个项目,我想显示字段并添加它们或者在窗体客户端显示它们,但只有在表单中满足某些输入条件时才会显示 - 例如。如果要提交的项目是一系列项目(is_project_series)的一部分,那么我可能想为例如显示多个表单域。系列中应该包含多少个项目,或者应该如何命名或编号,甚至可以基于这些动态字段的输入生成更多的动态输入 - 否则默认情况下,项目窗体可能只显示“项目名”的最简单字段,'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'] 

回答

0

当前模型实例传递给初始化所以你可以做你的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 
+0

真,但是__init__只在表单实例化时才执行?所以我将不得不发送一个is_project_series * arg发布到表单的第一个实例。我想避免发回和转发到服务器,并在表单中动态执行所有操作。我会用这个 - http://jsfiddle.net/QAaHP/16/ – Xeberdee