Мне нужно добавить дополнительную проверку к моему DateField в Admin, чтобы убедиться, что указанная дата будет в будущем. У меня нет такого опыта, поэтому вот что я сделал.
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) Отсутствует календарь JavaScript для поля даты и времени
Для меня совершенно очевидно, что я делаю что-то не так, но я не нашел примеров, относящихся к моим потребностям, так как я нуб. Как лучше добавить пользовательскую проверку в поле даты и времени, не путаясь в этом?
РЕДАКТИРОВАТЬ : Большое спасибо Брайану Люфту и Дэниелу Розману за правильные ответы! Чтобы сделать этот пост полезным для тех, кто сталкивается с той же проблемой, вот код:
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)