相关疑难解决方法(0)

Django形式,继承和表单字段的顺序

我在我的网站上使用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)

这让我闭嘴:)

python django django-forms

63
推荐指数
6
解决办法
3万
查看次数

Django 验证表单中的日期和时间

我有一个视图,我在表单提交时验证日期和时间,确保日期 + 时间没有过去。日期和时间是两个独立的字段。它有效,但我知道它的错误方式,并且应该在 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)

python forms django validation

5
推荐指数
2
解决办法
2万
查看次数

标签 统计

django ×2

python ×2

django-forms ×1

forms ×1

validation ×1