我需要添加額外的驗證到管理員的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