我在我的网站上使用Django表单,希望控制字段的顺序.

下面是我如何定义我的表单:

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


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

该名称是不可变的,应该仅在创建实体时列出.我使用继承来添加一致性和干燥性原则.实际上完全可以预料到的是,name字段在view/html中最后列出,但我希望name字段位于Summary和description之上.我确实意识到,通过将摘要和描述复制到create_form并松开继承,我可以很容易地修复它,但我想知道这是否可能.

假设您在EDIT_FORM中有Why?个字段,并且必须在CREATE_FORM中的顶部添加10个字段-那么复制和维护这两个表单看起来就不那么诱人了.(这是我的not个案子,我只是编个例子)

那么,我该如何克服这种行为呢?

Edit:

显然,要做到这一点,就必须经过恶意的黑客攻击(摆弄.field属性).这个field属性是一个SortedDict(Django的内部数据 struct 之一),它不提供任何方式来重新排列键:值对.它确实提供了一种在给定索引处插入项的方法,但这会将项从类成员移动到构造函数中.这种方法可以工作,但会降低代码的可读性.我认为唯一合适的方法是修改框架本身,这在大多数情况下都不是最优的.

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

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+

Django1.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']

Django相关问答推荐

Django BooleanField如何使用RadioSelect?

Django模型ManyToManyField.Add不起作用

Django Admin:在一个部分中同时显示多个应用程序?

从多个数据库访问 Django 会话

Django中用于外键的嵌套循环

如何在 Django REST Framework API 响应中使用多标签过滤器?

如何使用具有某些权限的 Django 组的转储数据和加载数据?

AttributeError:模块rest_framework.serializers在 Swagger 中的 Django 中没有属性NullBooleanField

是否可以在 Django 中重命名应用程序的组名?

在 Django CharFields 中自动截断 max_length 字段

断开模型的信号并在 django 中重新连接

Django rest-auth allauth 注册,带有邮箱、名字和姓氏,没有用户名

在 Django 中获取下一个和上一个对象

Django - 如何从模型实例中获取管理员 URL

Django ORM 能否以可靠的与后端无关的方式存储无符号 64 位整数(又名 ulong64 或 uint64)?

使用 request.user 的 Django 和中间件始终是匿名的

如何在 Django 中创建一个非空的 CharField?

Django REST 框架中的每个字段权限

ImportError:没有名为 django_filters 的模块

Django 字符串到日期格式