django: BooleanField, come impostare il valore predefinito su true?


107

Sto usando BooleanField in django. Per impostazione predefinita, la casella di controllo generata da esso è stato deselezionato, voglio che lo stato sia selezionato per impostazione predefinita, come si fa?

Risposte:


184

Se stai usando solo un modulo vaniglia (non un ModelForm), puoi impostare un valore iniziale del campo ( https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field. iniziale ) come

class MyForm(forms.Form):
    my_field = forms.BooleanField(initial=True)

Se stai utilizzando un ModelForm, puoi impostare un valore predefinito nel campo del modello ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), che verrà applicato al ModelForm risultante , piace

class MyModel(models.Model):
    my_field = models.BooleanField(default=True)

Infine, se desideri scegliere dinamicamente in fase di esecuzione se il tuo campo sarà selezionato per impostazione predefinita, puoi utilizzare il parametro iniziale del modulo quando lo inizializzi :

form = MyForm(initial={'my_field':True})

2
Grazie per form = MyForm(initial={'my_field':True}), non l'ho trovato subito nella documentazione.
Paco

Questa risposta è effettivamente sbagliata : il valore iniziale non è il valore predefinito come menzionato nella risposta
congelato il

142
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)

1
Dove è documentato? Viene menzionato initialnei documenti (per il modulo non associato), ma nondefault
utente

7
in questa risposta, il rispondente utilizza un campo modello, non un campo modulo. Ecco dove sta la differenza. Questo mi ha fatto inciampare perché l'ho saltato solo per vedere il kwarg predefinito. Il valore predefinito non è un form valido. Formato kwarg. Volevo solo postarlo per chiarire un po 'questa risposta, dal momento che ha 0 commenti.
Josh Brown

Funziona solo per i campi del modello di modulo. Inoltre, cambiare l'impostazione predefinita del modello solo per visualizzare l'iniziale in modo diverso è un po 'eccessivo, specialmente quando l'impostazione del valore iniziale è così semplice.
Guival


6

Sto usando django == 1.11. La risposta che ottiene il maggior numero di voti è effettivamente sbagliata. Controllando il documento da django, dice:

iniziale - Un valore da utilizzare nella visualizzazione iniziale di questo campo. Questo valore non viene utilizzato come riserva se i dati non vengono forniti.

E se approfondisci il codice del processo di convalida del modulo, scoprirai che, per ogni campo, il modulo chiamerà il suo widget value_from_datadict per ottenere il valore effettivo, quindi questo è il posto in cui possiamo inserire il valore predefinito.

Per farlo BooleanField, possiamo ereditare da CheckboxInput, sovrascrivere default value_from_datadicte initfunzione.

class CheckboxInput(forms.CheckboxInput):
    def __init__(self, default=False, *args, **kwargs):
        super(CheckboxInput, self).__init__(*args, **kwargs)
        self.default = default

    def value_from_datadict(self, data, files, name):
        if name not in data:
            return self.default
        return super(CheckboxInput, self).value_from_datadict(data, files, name)

Quindi usa questo widget durante la creazione BooleanField.

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)

Valido Django 3.0anche per . Grazie.
congelato il

0

In DJango 3.0 il valore predefinito di un BooleanField in model.py è impostato in questo modo:

class model_name(models.Model):
example_name = models.BooleanField(default=False)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.