2010-03-05 129 views
2

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

您是否已將元模型聲明添加到您的表單(並將其從代碼片段中刪除)?您可能不需要在表單上聲明字段,而應該使用「字段」或「排除」選項。最後,您可以嘗試將日期保留爲正常的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

回答

2

首先,上的ModelForm宣佈領域明確 - 無論是否在管理員的 - 並不意味着其他字段不會被顯示。您需要在表單的內部Meta類中定義fieldsexclude元組。如果其他字段都是默認值,則可以簡單地聲明您正在覆蓋的字段。其次,如果您希望自定義字段使用JavaScript,則需要使用正確的小部件,即django.contrib.admin.widgets.AdminDateWidget。但是,有一種更簡單的方法可以做到這一點,它根本不定義自定義字段,而是在表單本身上定義一個clean_date方法。