如何在Jinja中根据Profile模型对象是否存在显示对应入口?
正确实现逻辑的方法
你的代码问题在于直接访问user.profile时,如果Profile对象不存在,Django会抛出DoesNotExist异常,而不是返回一个可用.is_defined判断的对象。可以通过以下几种方式修正:
方法1:使用hasattr判断属性是否存在
在模板里通过hasattr检查用户是否拥有profile属性:
{% if hasattr(user, 'profile') %} <a class="nav-link" href="{% url 'profile' user.id %}">Perfil</a> {% else %} <a class="nav-link" href="{% url 'crearprofile' %}">Crear perfil</a> {% endif %}
方法2:利用一对一关系的profile_id字段
Django的一对一关系会自动为关联模型生成[关联模型名]_id字段,当Profile不存在时该字段值为None,可直接判断:
{% if user.profile_id %} <a class="nav-link" href="{% url 'profile' user.id %}">Perfil</a> {% else %} <a class="nav-link" href="{% url 'crearprofile' %}">Crear perfil</a> {% endif %}
方法3:在视图中提前传递判断变量
在视图函数中先判断用户是否有Profile,将结果传入模板:
# 视图示例 from django.shortcuts import render from .models import Profile def your_view(request): has_profile = Profile.objects.filter(user=request.user).exists() return render(request, 'your_template.html', {'has_profile': has_profile})
然后在模板中使用该变量:
{% if has_profile %} <a class="nav-link" href="{% url 'profile' user.id %}">Perfil</a> {% else %} <a class="nav-link" href="{% url 'crearprofile' %}">Crear perfil</a> {% endif %}
三种方法都能避免直接访问user.profile引发的异常,其中方法2最为简洁高效,推荐优先使用。
内容的提问来源于stack exchange,提问作者Edú Gracia
相关产品推荐
相关产品推荐

