Django campo obligatorio en el formulario modelo
Tengo un formulario donde un par de campos están saliendo como se requiere cuando no los quiero también. Aquí está el formulario 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)
Mi views.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?
6 answers
Si no desea modificar la configuración en blanco para sus campos dentro de los modelos (si lo hace, 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-15 21:11:02
Si el campo modelo tiene blank=True, entonces required se establece en False en el campo del formulario. De lo contrario, required = True
Lo Dice aquí: http://docs.djangoproject.com/en/dev/topics/forms/modelforms/
Parece que estás haciendo todo bien.
Puede comprobar el valor de self.fields['end'].required
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-15 23:45:10
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 campo de datos. Ha requerido establecer a False, el modelo tiene "null = True, blank = True" y el campo en el formulario muestra required=False si lo miro durante el método clean (), pero sigue diciendo que necesito un formato de fecha válido. No estoy usando ningún widget especial y recibo el mensaje "Ingrese una fecha válida" incluso cuando establezco explícitamente input_formats=['%Y - %m- % d', '%m/%d/%Y', '%m/%d/%y', "] en el campo de formulario.
EDIT: 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 "to" para indicar que el campo es la fecha de finalización; el campo se llama "end_time"). Estaba buscando específicamente la palabra" to " en el método clean() del formulario (también había probado el método clean_end_time (), pero nunca fue llamado) y establecer el valor de la variable clean_data en None como se sugiere en este ticket de Django. Sin embargo, nada de eso importaba ya que (supongo) la validación del modelo ya había vomitado en el formato de fecha no válida de "a" sin darme la oportunidad de interceptarlo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-30 14:46:41
Expandiendo la respuesta de DataGreed, creé un Mixin que te permite especificar una variable fields_required
en la clase Meta
así:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-14 13:29:18
Esto es un error al usar los widgets:
Solución: Usando los widgets de hora/fecha de Django en forma personalizada
O ticket 12303
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:37
De la documentación de campo del modelo ,
Si tiene un modelo como se muestra a continuación,
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 del formulario del titular a required=True
en lugar de blank=False
como la del modelo 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 begin
y end
a required=False
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-15 10:28:00