我在我的网站上使用Django表单,并希望控制字段的顺序.
这是我定义表单的方式:
class edit_form(forms.Form):
summary = forms.CharField()
description = forms.CharField(widget=forms.TextArea)
class create_form(edit_form):
name = forms.CharField()
Run Code Online (Sandbox Code Playgroud)
该名称是不可变的,只应在创建实体时列出.我使用继承来增加一致性和DRY原则.事实上完全预料到的不是错误的是名称字段在视图/ 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())
Run Code Online (Sandbox Code Playgroud)
这让我闭嘴:)
我有一个视图,我在表单提交时验证日期和时间,确保日期 + 时间没有过去。日期和时间是两个独立的字段。它有效,但我知道它的错误方式,并且应该在 Django Forms 中验证日期+时间。
这是在我的 view.py
(可能没有以正确的方式完成,但它有效)
my_date = request.session['reservationdate'] #in "mm/dd/yyyy" format
my_time = request.session['reservationtime'] #in "hh:mm" format
my_date_time = (my_date + ' ' + my_time + ':00') #convert to "mm/dd/yyyy hh:mm:ss"
my_date_time = datetime.strptime(my_date_time, '%m/%d/%Y %H:%M:%S') #convert to valid datetime
if datetime.now() <= my_date_time:
#do this
else:
...
Run Code Online (Sandbox Code Playgroud)
现在我的目标是在 Django 表单中有类似上面的内容:
class MyForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['my_date'].required = True
self.fields['my_time'].required = True
...
def clean_my_date(self):
my_date = self.cleaned_data['my_date']
my_time = self.cleaned_data['my_time']
my_date_time …Run Code Online (Sandbox Code Playgroud)