django: BooleanField, como definir o valor padrão como verdadeiro?

107

Estou usando o BooleanField no django. Por padrão, a caixa de seleção gerada por ele é o estado desmarcado, eu quero que o estado seja verificado por padrão, como fazer isso?

Bin Chen
fonte

Respostas:

184

Se você estiver usando apenas um formulário vanilla (não um ModelForm), você pode definir um valor inicial de campo ( https://docs.djangoproject.com/en/2.2/ref/forms/fields/#django.forms.Field. inicial ) gosto

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

Se estiver usando um ModelForm, você pode definir um valor padrão no campo do modelo ( https://docs.djangoproject.com/en/2.2/ref/models/fields/#default ), que se aplicará ao ModelForm resultante , gostar

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

Finalmente, se você deseja escolher dinamicamente no tempo de execução se o seu campo será ou não selecionado por padrão, você pode usar o parâmetro inicial para o formulário ao inicializá-lo :

form = MyForm(initial={'my_field':True})
Michael C. O'Connor
fonte
2
Obrigado por form = MyForm(initial={'my_field':True}), não o encontrei imediatamente na documentação.
Paco
Esta resposta está realmente errada : o valor inicial não é o valor padrão, conforme mencionado na resposta
congelada em
142
from django.db import models

class Foo(models.Model):
    any_field = models.BooleanField(default=True)
Vaibhav Sharma
fonte
1
Onde isso está documentado? Há menção de initialna documentação (para forma não vinculada), mas nãodefault
usuário de
7
nesta resposta, o respondente está usando um campo de modelo, não um campo de formulário. É aí que está a diferença. Isso me fez tropeçar porque eu pulei apenas para ver o kwarg padrão. O padrão não é um formulário válido. Form kwarg. Só queria postar isso para esclarecer um pouco essa resposta, já que não há comentários sobre ela.
Josh Brown
Isso só funciona para campos de modelo de formulário. Além disso, alterar o padrão do modelo apenas para exibir o inicial de forma diferente é um pouco demais, especialmente quando definir o valor inicial é tão simples.
guival
a inicial é do Django mais antigo. docs.djangoproject.com/en/2.0/ref/models/fields/#booleanfield
Sharpless512
6

Estou usando o django == 1.11. A resposta para obter a maioria dos votos está realmente errada. Verificando o documento do Django, ele diz:

inicial - um valor a ser usado na exibição inicial deste campo. Este valor não é usado como fallback se os dados não forem fornecidos.

E se você cavar no código do processo de validação do formulário, você descobrirá que, para cada campo, o formulário irá chamar seus widgets value_from_datadict para obter o valor real, então este é o lugar onde podemos injetar o valor padrão.

Para fazer isso BooleanField, podemos herdar CheckboxInput, substituir o padrão value_from_datadicte a initfunção.

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)

Em seguida, use este widget ao criar BooleanField.

class ExampleForm(forms.Form):
    bool_field = forms.BooleanField(widget=CheckboxInput(default=True), required=False)
DW
fonte
Válido para Django 3.0também. Obrigado.
congelada em
0

No DJango 3.0, o valor padrão de um BooleanField em model.py é definido assim:

class model_name(models.Model):
example_name = models.BooleanField(default=False)
VicenteC
fonte