2
respostas

[Dúvida] Criar condição para um campo no Model Django

Estou criando um Model com um campo boleano. O campo seguinte deste mesmo model, depende da ação no campo anterior(booleano). Caso seja não, este campo deve ficar desabilitado.

Segue o trecho do código:

class Jazigo(models.Model):
    models.CASCADE)
    sepultado_local = models.BooleanField(default=True)
    sepultamento_externo = models.ForeignKey(Cemiterio, on_delete=models.CASCADE)

Então, se o campo sepultado_local for falso, o próximo campo para escolher o cemitério que ele foi sepultado (sepultamento_externo) deve ser habilitado. Existe como fazer isso dentro do Model?

2 respostas

Sim, é possível definir uma condição dentro do Model do Django para habilitar ou desabilitar um campo com base no valor de outro campo. Uma maneira de fazer isso é sobrescrever o método init() do Model e definir a lógica para habilitar ou desabilitar o campo nesse método.

Você pode fazer algo assim:

class Jazigo(models.Model):
    sepultado_local = models.BooleanField(default=True)
    sepultamento_externo = models.ForeignKey(Cemiterio, on_delete=models.CASCADE, blank=True, null=True)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.sepultado_local:
            self._meta.get_field('sepultamento_externo').blank = False
            self._meta.get_field('sepultamento_externo').null = False
        else:
            self._meta.get_field('sepultamento_externo').blank = True
            self._meta.get_field('sepultamento_externo').null = True

O código acima sobrescreve o método init() do Model Jazigo. Dentro deste método, você pode verificar o valor do campo sepultado_local. Se o valor for False, o campo sepultamento_externo é habilitado definindo o blank e o null como False. Caso contrário, o campo é desabilitado definindo o blank e o null como True.

Note que adicionei os parâmetros blank=True e null=True na definição do campo sepultamento_externo, pois ele pode ser opcional (quando desabilitado) ou obrigatório (quando habilitado).

Eu entendi e é exatamente isso que eu queria. Só que aparentemente não funionou. Não sei se estou fazendo algo errado. usando a função no local errado... gravei um vídeo, se puder me ajudar. Como vc pode ver na imagem, ele não fica desabilitado.

O código está da seguinte forma:

class Jazigo(models.Model):
    identificacao_jazigo = models.OneToOneField(QuadraESepultura, on_delete=models.CASCADE, unique=True)
    requerente_jazigo = models.CharField(max_length=100, null=False, blank=False)
    transferencia_ossada = models.ForeignKey(TransferenciaDeOssada, on_delete=models.CASCADE, blank=True, null=True)

    sepultado_local = models.BooleanField(default=True)
    sepultamento_externo = models.ForeignKey(Cemiterio, on_delete=models.CASCADE, blank=True, null=True)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        if not self.sepultado_local:
            self._meta.get_field('sepultamento_externo').blank = False
            self._meta.get_field('sepultamento_externo').null = False
        else:
            self._meta.get_field('sepultamento_externo').blank = True
            self._meta.get_field('sepultamento_externo').null = True


    observacao = models.TextField(null=True)
    nome_sepultado = models.ForeignKey(Sepultado, on_delete=models.CASCADE)   
    arquivos = models.ManyToManyField(Arquivo)