2011-05-15 22 views
14

Quiero crear un campo de modelo Django (IntegerField) con un valor predeterminado, y también crear un formulario derivado del modelo, donde el campo es opcional. Si no está configurado en el formulario, cuando guarde el formulario, quiero que el valor predeterminado se guarde en el DB.¿Cómo asignar un valor predeterminado al campo Integerfield del modelo Django, mientras que FormField relacionado es opcional?

# model.py 
class Invoice(models.Model): 
    # IntegrityError "Column 'expireDays' cannot be null" 
    expireDays = models.PositiveSmallIntegerField(default=1) 

    # expireDays = *null* in DB 
    expireDays = models.PositiveSmallIntegerField(default=1, blank=True, null=True) 

# forms.py 
class InvoiceForm(forms.ModelForm): 
    # leaving this line out gives invalid form 
    expireDays = forms.IntegerField(required=False) 
    class Meta: 
     model = Invoice 

(que utiliza solamente una de las líneas de la declaración de campo a la vez. :)

Ni siquiera estoy seguro de que estoy declarando el valor por defecto correctamente. La única referencia que pude encontrar fue en un artículo en handling choices de James Bennett. Todavía tengo que encontrarlo en los documentos de Django (estoy usando la versión 1.2 - ¿tal vez está en 1.3?)

Actualización - Intenté establecer el valor predeterminado del campo en la base de datos MySql, sin ningún efecto. Parece como si, incluso cuando el formulario no tiene un valor para el campo, sigue adelante y asigna nulo al DB, anulando el valor predeterminado de MySql.

Aunque actualmente solo estoy estableciendo un valor predeterminado en la vista que crea el formulario, realmente no me gusta, ya que asume la responsabilidad de la integridad del campo en la vista , no en la base de datos.

La forma en que tendría pensaron que iba a funcionar, es que el campo se podría establecer, o no, en la forma - Si se establece, que el valor se escribe en la base de datos, y si no conjunto, el DB predeterminado se usaría. En cambio, si no se establece, el formulario escribe nulo en la base de datos. Entonces, ¿qué sentido tiene tener un valor predeterminado en la declaración de ModelField si no se utiliza? ¿Qué hace exactamente?

Respuesta

17

i desea campo para ser opcional - acaba de salir segunda definición en el modelo y no añaden nada a la definición del formulario:

class Invoice(models.Model): 
    expireDays = models.PositiveSmallIntegerField(default=1, blank=True, null=True) 

class InvoiceForm(forms.ModelForm): 
    class Meta: 
     model = Invoice 

actualización, por lo que en caso de que no existe un conjunto de valor, utilice 1 como el valor del campo:

class InvoiceForm(forms.ModelForm): 

    def clean_expireDays(self): 
     exp_days = self.cleaned_data.get('expireDays') 
     if exp_days is None: 
      return self.fields['expireDays'].initial 
      # above can be: return 1 
      # but now it takes value from model definition 
     else: 
      return exp_days 

    class Meta: 
     model = Invoice 
+0

Mi post no puede haber sido claro, pero esa es una de las combinaciones que he intentado - y el campo de datos de MySQL se muestra como * * nula cuando hago eso, no un * 1 *. –

+0

Comenta la actualización, de hecho, lo estoy haciendo de otra manera, estableciendo el campo en los datos POST (copiados) en un valor predeterminado de 1, antes de pasar los datos POST al formulario. Pero eso * todavía * pone la lógica para mantener la integridad de los datos dentro del formulario, y no la base de datos donde lo quiero. El MySql db debería estar asignando el valor predeterminado. Lo que hubiera esperado que sucediera, es que si el * formulario * no obtiene un valor, no trataría de establecer el valor de DB, pero parece que está asignando un NULL al DB, que anula incluso el valor predeterminado que configuré a mano en el DB. –

Cuestiones relacionadas