tengo un modelo que se parece a:Añadir campos a Django ModelForm que no están en el modelo
class MySchedule(models.Model):
start_datetime=models.DateTimeField()
name=models.CharField('Name',max_length=75)
con él viene su ModelForm:
class MyScheduleForm(forms.ModelForm):
startdate=forms.DateField()
starthour=forms.ChoiceField(choices=((6,"6am"),(7,"7am"),(8,"8am"),(9,"9am"),(10,"10am"),(11,"11am"),
(12,"noon"),(13,"1pm"),(14,"2pm"),(15,"3pm"),(16,"4pm"),(17,"5pm"),
(18,"6pm"
startminute=forms.ChoiceField(choices=((0,":00"),(15,":15"),(30,":30"),(45,":45")))),(19,"7pm"),(20,"8pm"),(21,"9pm"),(22,"10pm"),(23,"11pm")))
class Meta:
model=MySchedule
def clean(self):
starttime=time(int(self.cleaned_data.get('starthour')),int(self.cleaned_data.get('startminute')))
return self.cleaned_data
try:
self.instance.start_datetime=datetime.combine(self.cleaned_data.get("startdate"),starttime)
except TypeError:
raise forms.ValidationError("There's a problem with your start or end date")
Básicamente, estoy tratando de Divida el campo DateTime en el modelo en 3 campos de formulario más fáciles de usar: un selector de fecha, un menú desplegable de una hora y un menú desplegable de un minuto. Luego, una vez que obtuve las tres entradas, las vuelvo a ensamblar en un DateTime y las guardo en el modelo.
algunas preguntas:
1) ¿Es ésta totalmente la forma equivocada de hacerlo? No quiero crear campos en el modelo por horas, minutos, etc., ya que básicamente todo son solo datos intermedios, así que me gustaría una manera de dividir el campo DateTime en subcampos.
2) La dificultad que me encuentro es cuando el campo de fecha de inicio está en blanco - parece que nunca se verifica por falta de nitidez, y acaba arrojando un TypeError más tarde cuando el programa espera una fecha y obtiene ninguno ¿Dónde comprueba Django las entradas en blanco y genera el error que eventualmente vuelve al formulario? ¿Es esta mi responsabilidad? Si es así, ¿cómo lo hago, ya que no evalúa clean_startdate() ya que startdate no está en el modelo?
3) ¿Hay alguna forma mejor de hacer esto con la herencia? ¿Tal vez heredar MyScheduleForm en BetterScheduleForm y agregar los campos allí? ¿Cómo haría esto? (He estado jugando con ello durante más de una hora y parece que no puede conseguirlo)
¡Gracias!
[Editar:] quedado fuera de la self.cleaned_data retorno - perdido en el copiar/pegar originalmente
En general, ModelForm puede contener los campos que desee. Es como una forma normal en ese sentido. La única preocupación es que necesitará implementar los datos iniciales, los métodos clean() apropiados y el método save() apropiado si esos campos no existen en el modelo, ya que un ModelForm intenta generar esos elementos de forma auto-mágica usando el modelo. – Cerin