【问题标题】:How to make Django forms dynamic (with clickable fields and appearing fields)如何使 Django 表单动态化(带有可点击字段和显示字段)
【发布时间】:2017-11-09 08:45:48
【问题描述】:

在我的 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. 可用章节列表(介绍、假设...),当他们单击特定章节时,他们希望包含与该章节相关的所有字段。所有没有被选中或点击的章节都应该被视为状态为关闭,因此它们不应该显示。

现在,我的 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__'

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

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

【问题讨论】:

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


    【解决方案1】:

    我建议创建另一个模型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是否显示为内联

    【讨论】:

    • 嗨@itzMEonTV,非常感谢您的回答。我已经阅读了链接的文档,发现它有点令人困惑(我对 Django 很陌生)。据您所知,还有其他示例可以阅读以真正确保我了解内联过程吗?
    猜你喜欢
    • 2019-05-02
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2017-07-29
    • 2020-10-24
    相关资源
    最近更新 更多