python - Django表单,表单字段的继承和顺序

标签 python django django-forms

我在我的网站中使用 Django 表单并希望控制字段的顺序。

这是我定义表单的方式:

class edit_form(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)


class create_form(edit_form):
    name = forms.CharField()

名称是不可变的,仅应在创建实体时列出。我使用继承来添加一致性和 DRY 原则。发生的事情并没有错,事实上完全可以预料的是,名称字段在 View /html 中最后列出,但我希望名称字段位于摘要和描述之上。我确实意识到我可以通过将摘要和描述复制到 create_form 并松散继承来轻松修复它,但我想知道这是否可能。

为什么?假设您在 edit_form 中有 100 个字段,并且必须在 create_form 的顶部添加 10 个字段 - 复制和维护这两个表单看起来不会那么性感。 (这不是我的情况,我只是在编一个例子)

那么,我该如何覆盖这种行为呢?

编辑:

显然,如果不经历令人讨厌的黑客攻击(摆弄 .field 属性),就没有正确的方法可以做到这一点。 .field 属性是一个 SortedDict(Django 的内部数据结构之一),它不提供任何重新排序键:值对的方法。但是,它确实提供了一种在给定索引处插入项目的方法,但这会将项目从类成员移动到构造函数中。这种方法可行,但会使代码的可读性降低。我认为合适的唯一其他方法是修改框架本身,这在大多数情况下都不是最佳的。

简而言之,代码会变成这样:

class edit_form(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)


class create_form(edit_form):
    def __init__(self,*args,**kwargs):
        forms.Form.__init__(self,*args,**kwargs)

        self.fields.insert(0,'name',forms.CharField())

这让我闭嘴:)

最佳答案

来自 Django 1.9+

Django 1.9 添加了一个新的 Form 属性,field_order,允许对字段进行排序,而不管它们在类中的声明顺序。

class MyForm(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)
    author = forms.CharField()
    notes = form.CharField()

    field_order = ['author', 'summary']

field_order 中的缺失字段保持它们在类中的顺序,并附加在列表中指定的字段之后。上面的示例将按以下顺序生成字段:['author', 'summary', 'description', 'notes']

查看文档:https://docs.djangoproject.com/en/stable/ref/forms/api/#notes-on-field-ordering

高达 Django 1.6

我遇到了同样的问题,我在 Django CookBook 中找到了另一种重新排序字段的技术。 :

class EditForm(forms.Form):
    summary = forms.CharField()
    description = forms.CharField(widget=forms.TextArea)


class CreateForm(EditForm):
    name = forms.CharField()

    def __init__(self, *args, **kwargs):
        super(CreateForm, self).__init__(*args, **kwargs)
        self.fields.keyOrder = ['name', 'summary', 'description']

关于python - Django表单,表单字段的继承和顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/913589/

相关文章:

python - 在 Python 中声明未知类型变量?

python - django queryset "contains"用于列表,而不是字符串

python - Django 多对多字段

django - 在 Django 中使用有效的 HTML 4.01 Strict

python - Django 重定向到点击页面

python - Django 接受一个整数到一个 CharField

python - 如何模拟_auto_now?

android - 适用于 Android 的 PyQt5 GUI 与 Kivy GUI

python - SQLAlchemy.declarative 和延迟列加载

django - 执行删除数据库后,开发服务器上的 django 管理页面中缺少 CSS