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?

Author: Serjik, 2009-07-16

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.

 108
Author: DataGreed,
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.

 17
Author: stefanw,
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.

 3
Author: Tom,
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
 3
Author: gitaarik,
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

 0
Author: Samuel Adam,
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

 0
Author: All Іѕ Vаиітy,
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