Django requiere campo en forma de modelo.

Tengo un formulario donde aparecen un par de campos cuando no los quiero también. Aquí está la forma de models.py

class CircuitForm(ModelForm): class Meta: model = Circuit exclude = ('lastPaged',) def __init__(self, *args, **kwargs): super(CircuitForm, self).__init__(*args, **kwargs) self.fields['begin'].widget = widgets.AdminSplitDateTime() self.fields['end'].widget = widgets.AdminSplitDateTime() 

En el modelo de circuito real, los campos se definen así:

 begin = models.DateTimeField('Start Time', null=True, blank=True) end = models.DateTimeField('Stop Time', null=True, blank=True) 

Mis puntos de vista.py para esto está aquí:

 def addCircuitForm(request): if request.method == 'POST': form = CircuitForm(request.POST) if form.is_valid(): form.save() return HttpResponseRedirect('/sla/all') form = CircuitForm() return render_to_response('sla/add.html', {'form': form}) 

¿Qué puedo hacer para que los dos campos no sean obligatorios?

Si no desea modificar la configuración en blanco para sus campos dentro de los modelos (hacerlo romperá la validación normal en el sitio de administración), puede hacer lo siguiente en su clase de formulario:

 def __init__(self, *args, **kwargs): super(CircuitForm, self).__init__(*args, **kwargs) for key in self.fields: self.fields[key].required = False 

El constructor redefinido no dañará ninguna funcionalidad.

Si el campo del modelo tiene en blanco = Verdadero, entonces requerido se establece en Falso en el campo del formulario. De lo contrario, requerido = Verdadero.

Lo dice aquí: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

Parece que estás haciendo todo bien. Puede verificar el valor de self.fields['end'].required .

Ampliando la respuesta de DataGreed, creé un Mixin que te permite especificar una variable fields_required en la clase Meta como esta:

 class MyForm(RequiredFieldsMixin, ModelForm): class Meta: model = MyModel fields = ['field1', 'field2'] fields_required = ['field1'] 

Aquí está:

 class RequiredFieldsMixin(): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) fields_required = getattr(self.Meta, 'fields_required', None) if fields_required: for key in self.fields: if key not in fields_required: self.fields[key].required = False 

No es una respuesta, pero para cualquier otra persona que encuentre esto a través de Google, un poco más de datos: esto me está sucediendo en un formulario modelo con un DateField. Se requirió establecer Falso, el modelo tiene “null = True, blank = True” y el campo en el formulario muestra required = False si lo veo durante el método clean (), pero todavía dice que necesito una fecha válida formato. No estoy usando ningún widget especial y recibo el mensaje “Ingrese una fecha válida”, incluso cuando establecí explícitamente input_formats = [‘% Y-% m-% d’, ‘% m /% d /% Y’, ‘ % m /% d /% y ‘,’ ‘] en el campo de formulario.

EDITAR: No sé si ayudará a alguien más, pero resolví el problema que estaba teniendo. Nuestro formulario tiene algún texto predeterminado en el campo (en este caso, la palabra “a” para indicar que el campo es la fecha de finalización; el campo se llama “end_time”). Buscaba específicamente la palabra “to” en el método clean () del formulario (también probé el método clean_end_time (), pero nunca se llamó) y establecí el valor de la variable clean_data en Ninguno como se sugiere en este Django boleto Sin embargo, nada de eso importaba, ya que (supongo) la validación del modelo ya se había descifrado en el formato de fecha no válida de “a” sin darme la oportunidad de interceptarlo.

Este es un error al usar los widgets:

solución alternativa: uso de los widgets de fecha / hora de Django en forma personalizada

o boleto 12303

De la documentación del campo modelo ,

Si tienes un modelo como se muestra abajo,

 class Article(models.Model): headline = models.CharField( max_length=200, null=True, blank=True, help_text='Use puns liberally', ) content = models.TextField() 

Puede cambiar la validación de la forma del título a required=True lugar de en blank=False como el del modelo, ya que define el campo como se muestra a continuación.

 class ArticleForm(ModelForm): headline = MyFormField( max_length=200, required=False, help_text='Use puns liberally', ) class Meta: model = Article fields = ['headline', 'content'] 

Así que respondiendo a la pregunta,

 class CircuitForm(ModelForm): begin = forms.DateTimeField(required=False) end = forms.DateTimeField(required=False) class Meta: model = Circuit exclude = ('lastPaged',) 

esto hace que begin y end como required=False