如何使Django表单动态化(包含可点击字段和显示字段)

时间:2017-11-09 08:45:49

标签: django django-models django-forms django-templates

在我的Django项目中,我有以下模型:

models.py

class Paper(models.Model):
     title = models.CharField(max_length=500)
     description = models.CharField(max_length=1500)
     chapter_1 = models.CharField(max_length=50, default='Intro')
     chapter_1_status = models.CharField(max_length=3, choices=[('On','On'), ('Off','Off')], blank=True, null=True)
     chapter_1_description = models.CharField(max_length=1500)
     chapter_1_word_count = models.IntegerField()
     chapter_1_reading_time = models.DurationField(blank=True, null=True)
     chapter_2 = models.CharField(max_length=50, default='Hypothesis')
     chapter_2_status = models.CharField(max_length=3, choices=[('On','On'), ('Off','Off')], blank=True, null=True)
     chapter_2_description = models.CharField(max_length=1500)
     chapter_2_word_count = models.IntegerField()
     chapter_2_reading_time = models.DurationField(blank=True, null=True)

正如您所看到的,除了标题和描述之外,所有其他字段都是重复的(第1章,第2章,第3章等等,直到第9章,这是指定论文的最大值)。

我正在使用字段状态来检查该章节是否实际包含在论文中。如果有人选择了关闭,该章节将不会显示在论文中。

我现在需要将这个概念转化为更高级的东西:我希望有一个用户看到的表单,而不是使用常规的Django表单:

  1. 标题
  2. 描述
  3. 可用章节的列表(介绍,假设......),当他们点击特定章节时,他们希望包括与该章节相关的所有字段。所有未被选中或点击的章节都应被视为状态为Off,因此不应显示。
  4. 现在,我的forms.py看起来像这样:

    class PaperFormClass(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(PaperFormClass, self).__init__(*args, **kwargs)
            for field in iter(self.fields):
                self.fields[field].widget.attrs.update({
                    'class': 'form-control form-control-lg'
            })
    
        class Meta:
            model = Paper
            fields = '__all__'
    
    class PaperForm(forms.ModelForm):
    
        class Meta:
            model = Paper
            fields = '__all__'
    

    如何实现一个表单,而不是显示模型中的每个字段,只显示标题,描述和可以包含在论文中的所有章节的可点击列表?单击一章后,与该章相关的其他字段应显示并可编辑。

    非常感谢您提出任何建议。

1 个答案:

答案 0 :(得分:0)

我建议创建另一个模型Chapter

class Chapter(models.Model):
     paper = models.ForeignKey(Paper, related_name="chapters")
     chapter = models.CharField(max_length=2, default='1', choices=[(i, i) for i in range(1,10)])
     status = models.CharField(max_length=3, choices=[('On','On'), ('Off','Off')], blank=True, null=True)
     description = models.CharField(max_length=1500)
     word_count = models.IntegerField()
     reading_time = models.DurationField(blank=True, null=True)

然后检查inline show as inlines