python - superusuario - tipos de formularios en django
ValidaciĆ³n personalizada en el administrador de Django. (2)
Por lo general, solo desea definir un método clean () en el propio modelo.
https://docs.djangoproject.com/en/2.1/ref/models/instances/#validating-objects
from django.core.exceptions import ValidationError
class Lecture(models.Model):
topic = models.CharField(max_length=100)
speaker = models.CharField(max_length=100)
start_date = models.DateField()
end_date = models.DateField()
def clean(self):
if self.start_date > self.end_date::
raise ValidationError("Dates are incorrect")
Algo así funcionará en el administrador de django sin necesidad de crear una clase de formulario.
Tengo una aplicación Django muy simple para grabar las conferencias dadas a mis colegas. Ya que es bastante elemental, estoy usando el administrador de Django. Aquí está mi models.py:
#models.py
from django.db import models
class Lecture(models.Model):
topic = models.CharField(max_length=100)
speaker = models.CharField(max_length=100)
start_date = models.DateField()
end_date = models.DateField()
Debo asegurarme de que nadie ingrese la fecha de inicio después de la fecha de finalización en los formularios de administración, así que leí los documentos de django para la validación personalizada en el administrador e implementé lo siguiente en mi admin.py:
#admin.py
from models import Lecture
from django.contrib import admin
from django import forms
class LectureForm(forms.ModelForm):
class Meta:
model = Lecture
def clean(self):
start_date = self.cleaned_data.get(''start_date'')
end_date = self.cleaned_data.get(''end_date'')
if start_date > end_date:
raise forms.ValidationError("Dates are incorrect")
return self.cleaned_data
class LectureAdmin(admin.ModelAdmin):
form = LectureForm
list_display = (''topic'', ''speaker'', ''start_date'', ''end_date'')
admin.site.register(Lecture, LectureAdmin)
Sin embargo, esto no tiene ningún efecto en mi administrador y puedo guardar clases en las que start_date es después de end_date como se ve en la imagen:
Qué estoy haciendo mal ??
Tienes un problema de sangría. Su método de clean
está sangrado dentro de la clase Meta del formulario. Retrocede un nivel. Además, asegúrese de que la instrucción de return
esté sangrada dentro del método.