Qual é o equivalente a “nenhum” nos modelos django?

102

Eu quero ver se um campo / variável não é nenhum dentro de um modelo Django. Qual é a sintaxe correta para isso?

Isso é o que eu tenho atualmente:

{% if profile.user.first_name is null %}
  <p> -- </p>
{% elif %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif%}

No exemplo acima, o que eu usaria para substituir "nulo"?

goelv
fonte

Respostas:

132

None, False and Truetodos estão disponíveis em tags e filtros de modelo. None, False, a string vazia ( '', "", """""") e as listas / tuplas vazias são avaliadas Falsequando avaliadas por if, então você pode fazer facilmente

{% if profile.user.first_name == None %}
{% if not profile.user.first_name %}

Uma dica: @fabiocerqueira tem razão, deixe a lógica para os modelos, limite os templates para serem a única camada de apresentação e calcule coisas assim no seu modelo. Um exemplo:

# someapp/models.py
class UserProfile(models.Model):
    user = models.OneToOneField('auth.User')
    # other fields

    def get_full_name(self):
        if not self.user.first_name:
            return
        return ' '.join([self.user.first_name, self.user.last_name])

# template
{{ user.get_profile.get_full_name }}

Espero que isto ajude :)

Gerard
fonte
Acabei de tentar passar None como parâmetro para a tag {% cache%} e descobri que não está disponível. Ocupado trabalhando nisso.
tobych
7
{% if profile.user.first_name is None %}causa erro de sintaxe no template do Django.
Rockallite
1
Sua dica mistura apresentação e lógica ao colocar HTML em seu modelo, fazendo exatamente o oposto do que você está tentando ensinar. Que tal retornar None se não houver nome (comportamento lógico para um modelo de dados) e, em seguida, usar o default_if_nonefiltro no modelo?
jbg
@ JasperBryant-Greene você está certo! apenas atualizado. Boa pegada, cara! THX!
Gerard
67

Você também pode usar outro modelo integrado default_if_none

{{ profile.user.first_name|default_if_none:"--" }}
Babacar Gningue
fonte
1
Alguma ideia de como usar isso com outros filtros, como data? Por exemplo, é possível exibir "N / A" se uma data for nenhuma, mas, caso contrário, formatá-la? Como: {{post.pub_date | default_if_none: "N / A" | data: "Ymd"}}?
Andreas Bergström
@ AndreasBergström No seu caso, você se inscreve dateprimeiro. Se ocorrer algum erro, ele retornará Nenhum. Então você aplica default_if_none.
defance
Qual versão do Django foi trazida?
Usuário em
10

isoperador: Novo no Django 1.10

{% if somevar is None %}
  This appears if somevar is None, or if somevar is not found in the context.
{% endif %}
user6763622
fonte
5

Olhe para o ajudante yesno

Por exemplo:

{{ myValue|yesno:"itwasTrue,itWasFalse,itWasNone" }}
mwjackson
fonte
4

{% if profile.user.first_name %}funciona (supondo que você também não queira aceitar '').

ifem Python em guloseimas gerais None, False, '', [], {}, ... tudo como falsa.

Dougal
fonte
3

Você também pode usar o filtro de modelo integrado default:

Se o valor for avaliado como False (por exemplo, Nenhum, uma string vazia, 0, False); o padrão "-" é exibido.

{{ profile.user.first_name|default:"--" }}

Documentação: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#default

Louis
fonte
1
default_if_none provavelmente seria uma opção melhor.
dbn
0

Você pode tentar isto:

{% if not profile.user.first_name.value %}
  <p> -- </p>
{% else %}
  {{ profile.user.first_name }} {{ profile.user.last_name }}
{% endif %}

Dessa forma, você está essencialmente verificando se o campo do formulário first_nametem algum valor associado a ele. Veja {{ field.value }}em Loop sobre os campos do formulário na Documentação do Django .

Estou usando Django 3.0.

Claypooj
fonte