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?

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})

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)

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


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)

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.