2010-03-05 77 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方法。