can';t覆盖默认的管理模型表单django

can';t覆盖默认的管理模型表单django,django,django-models,django-admin,validation,Django,Django Models,Django Admin,Validation,我需要添加额外的验证我的日期字段在管理,以确保给定的日期是在未来。我在这方面没有经验,所以我就这么做了。 1) 我已经创建了自定义表单字段并向其添加了验证: class PastDateField(forms.DateField): def clean(self, value): """Validates if only date is in the past """ if not value: raise forms.Valida

我需要添加额外的验证我的日期字段在管理,以确保给定的日期是在未来。我在这方面没有经验,所以我就这么做了。 1) 我已经创建了自定义表单字段并向其添加了验证:

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) datetime字段缺少JavaScript日历

对我来说,很明显我做错了什么,但我没有发现与我的需求相关的例子,因为我是一个noob。在datetime字段中添加自定义验证而不造成混乱的更好方法是什么

编辑:非常感谢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)

首先,在ModelForm上显式声明字段(无论是在admin中还是在admin之外),并不意味着其他字段将不显示。您需要在表单的内部
Meta
类中定义
字段
排除
元组。如果其他字段都是默认字段,则只需声明要覆盖的字段即可


其次,如果希望自定义字段使用javascript,则需要使用正确的小部件,即
django.contrib.admin.widgets.AdminDateWidget
。但是,有一种更简单的方法可以做到这一点,那就是根本不定义自定义字段,而是在表单本身上定义一个
clean\u date
方法。

您是否将元模型声明添加到表单中(只是将其从代码段中删除)?您可能不需要在表单上声明字段,而应该使用“字段”或“排除”选项。最后,您可以尝试将date保留为普通的DateField,并在表单本身上提供一个clean_date方法:您还可以粘贴到模型定义中吗?