Django campo obligatorio en el formulario modelo de la

Tengo un formulario donde un par de campos están saliendo como se requiere cuando no las quiero demasiado. 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 actual modelo de Circuito, los campos se definen como este:

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 son obligatorios?

  • No hay manera de que estos campos son requeridos por el cambio de los widgets. Si los modelos se ha (null=True, blank=True), el modelForm representa como requerido=False.
  • Parece que está a la derecha. Los campos no son obligatorios, pero los campos de Fecha y Hora en el widget se requiere.
InformationsquelleAutor Ryan | 2009-07-15

6 Kommentare

  1. 111

    Si usted no desea modificar en blanco la configuración de los campos dentro de los modelos que de lo contrario se romperá normal de validación en el sitio de administración), puede hacer lo siguiente en la clase de Formulario:

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

    La redefinido constructor de no dañar ninguna funcionalidad.

  2. 17

    Si el modelo del campo ha blank=True, entonces se requiere se establece en False en el campo de formulario. De lo contrario, se requiere=True

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

    Parece que está haciendo todo bien.
    Usted puede comprobar el valor de self.fields['end'].required.

  3. 5

    Expansión en DataGreed la respuesta, he creado un Mixin que le permite especificar un fields_required variable en el Meta clase como esta:

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

    Aquí es:

    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
    • ¿Qué pasará si el usuario de este mixin anulará __init__ así? será el mixin todavía funcionan? cómo la herencia múltiple será resuelto?
    • cuando se reemplaza __init__ siempre debe llamar a super(), como se hace en mi fragmento de código.
    • Por lo que si entiendo – puedo crear un formulario y subclase de MyForm. Yo llamo super de init(), que llamará al mixin init, pero cuando djangl forma init se llama?
    • Sí, hay otros recursos discutiendo esto, también puede crear una nueva pregunta si desea, por favor, mantenga los comentarios aquí en el tema de esta pregunta en particular.
  4. 3

    No es una respuesta, pero para cualquier otra persona que se encuentra presente a través de Google, más de un bit de datos: esto es lo que me está ocurriendo en un Modelo de Formulario con un DateField. Se ha requerido que se establece en False, el modelo «null=True, blank=True» y el campo en el formulario de muestra requerido=False si la miro durante la limpieza() método, pero sigue diciendo que necesito un formato de fecha válido. Yo no estoy usando ningún tipo especial de widget y me sale el «Introduzca una fecha válida» mensaje incluso cuando me establezca explícitamente input_formats=[‘%Y-%m-%d’, ‘%m/%d/%Y’, ‘%m/%d/%y’, «] en el campo de formulario.

    EDICIÓN: no se sabe si se va a ayudar a nadie, pero he resuelto el problema que tenía. Nuestro formulario de texto predeterminado en el campo (en este caso, la palabra «a» para indicar que el campo es la fecha de terminación; el campo se llama «end_time»). Yo estaba buscando específicamente la palabra «para» en la forma de limpiar() método (yo también había probado el clean_end_time() método, pero nunca lo llamaron) y ajuste el valor de la clean_data variable a Ninguno, como se sugiere en este Django billete. Sin embargo, nada de eso importaba como (supongo) el modelo de validación ya había puked en el formato de fecha no válida de la «a» sin darme una oportunidad para interceptarla.

  5. 0

    De la modelo de documentación de campo,

    Si usted 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 el título de la validación de formulario para required=True en lugar de blank=False como la de la modelo como la definición de los campos 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 a required=False

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea