Je dois ajouter une validation supplémentaire à mon champ DateField dans Admin pour m'assurer que la date donnée est dans le futur. Je n'ai aucune expérience dans une telle chose, alors voici ce que j'ai fait. 1) J'ai créé champ de formulaire personnalisé et validation ajoutai:ne peut pas remplacer le modèle d'administrateur par défaut formulaire 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) Ensuite, j'ai ajouté sous forme de modèle personnalisé:
class CustomNewsItemAdminForm(forms.ModelForm):
title = forms.CharField(max_length=100)
body = forms.CharField(widget=forms.Textarea)
date = PastDateField()
region = forms.ModelChoiceField(Region.objects)
3) Et voici comment je me suis inscrit admin:
class NewsItemAdmin(admin.ModelAdmin):
form = CustomNewsItemAdminForm
def queryset(self, request):
return NewsItem.objects.all()
admin.site.register(NewsItem, NewsItemAdmin)
Le résultat de ceci est que ma forme admin 1) Indique le terrain que je ne l'ai pas spécifié sous forme d'administration personnalisée 2) Lacks JavaScr ipt calendrier pour le champ datetime
Il est assez évident pour moi que je fais quelque chose de mal, mais je n'ai trouvé aucun exemple pertinent à mes besoins comme je suis un noob. Quelle est la meilleure façon d'ajouter une validation personnalisée au champ datetime sans gâcher les choses?
EDIT: Merci beaucoup à Brian Luft et Daniel Roseman pour les bonnes réponses! Pour ce poste utile pour quelqu'un face au même problème est le code qui en résulte ici:
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)
Avez-vous ajouté la déclaration de modèle Meta à votre formulaire (et l'avez juste laissé à côté de l'extrait)? Vous n'avez probablement pas besoin de déclarer les champs sur votre formulaire et devez utiliser l'option 'fields' ou 'exclude' à la place. Enfin, vous pouvez essayer de quitter la date comme un champ DateField normal et fournir une méthode clean_date sur le formulaire lui-même: http://docs.djangoproject.com/fr/1.1/ref/contrib/admin/#adding-custom-validation-to -the-admin http://docs.djangoproject.com/fr/1.1/topics/forms/modelforms/#overriding-modelform-clean-method Pouvez-vous aussi coller dans votre définition de modèle? –