我需要添加额外的验证到管理员的DateField中,以确保日后给出的日期。我没有这方面的经验,所以这就是我所做的。 1)我已经创建自定义表单字段并添加验证它:无法覆盖默认的管理模型窗体django
class PastDateField(forms.DateField):
def clean(self, value):
"""Validates if only date is in the past
"""
if not value:
raise forms.ValidationError('Plase enter the date')
if value > datetime.now():
raise forms.ValidationError('The date should be in the past, not in future')
return value
2)然后我添加了自定义模型形式:
class CustomNewsItemAdminForm(forms.ModelForm):
title = forms.CharField(max_length=100)
body = forms.CharField(widget=forms.Textarea)
date = PastDateField()
region = forms.ModelChoiceField(Region.objects)
3)这里就是我是如何注册管理员:
class NewsItemAdmin(admin.ModelAdmin):
form = CustomNewsItemAdminForm
def queryset(self, request):
return NewsItem.objects.all()
admin.site.register(NewsItem, NewsItemAdmin)
这样做的结果是,我的管理形式 1)显示我没有定制管理规定的形式现场 2)还缺JavaScr日期时间字段的ipt日历
对我来说很明显我做错了什么,但是我发现没有与我的需求相关的示例,因为我是noob。什么是更好的方式来添加自定义验证日期时间字段而不会搞砸事情?
编辑:非常感谢Brian Luft和Daniel Roseman的正确答案!为了使某人在这里面临着同样的问题,这个帖子有帮助的是产生的代码:
class CustomNewsItemAdminForm(forms.ModelForm):
class Meta:
model = NewsItem
def clean_date(self):
"""Validates if only date is in the past
"""
date = self.cleaned_data["date"]
if date is None:
raise forms.ValidationError('Plase enter the date')
if date > datetime.now().date():
raise forms.ValidationError('The date should be in the past, not in future')
return self.cleaned_data["date"]
class NewsItemAdmin(admin.ModelAdmin):
form = CustomNewsItemAdminForm
def queryset(self, request):
return NewsItem.objects.all()
admin.site.register(NewsItem, NewsItemAdmin)
您是否已将元模型声明添加到您的表单(并将其从代码片段中删除)?您可能不需要在表单上声明字段,而应该使用“字段”或“排除”选项。最后,您可以尝试将日期保留为正常的DateField,并在表单上提供一个clean_date方法: http://docs.djangoproject.com/en/1.1/ref/contrib/admin/#adding-custom-validation-to -the-admin http://docs.djangoproject.com/en/1.1/topics/forms/modelforms/#overriding-modelform-clean-method 您是否也可以粘贴模型定义? – 2010-03-05 23:36:56