Django项目无法正确过滤所属公司关联雇主数据问题求助
问题根因
现有代码报错、变量取值异常来自两个核心逻辑错误:
- 视图层异常捕获写法错误:
except company.DoesNotExist里的company是待赋值的实例变量,不是模型类,查询不到公司时代码还未完成company赋值就调用其属性,会直接抛出NameError,根本走不到company = None的分支。 - 无效查询问题:当
company为None时直接执行Employer.objects.filter(company=company),会触发字段类型匹配错误,甚至返回全量脏数据。 - 模板层存在逻辑瑕疵:雇主的社交账号字段允许为空,未做非空判断时会渲染出空跳转链接,点击会异常跳转到当前页面。
修正方案
1. 修复视图层逻辑
修正异常捕获类,提前初始化空查询集避免无效查询,也可以直接用filter().first()省略try/except写法,代码更简洁不易出错:
from django.shortcuts import render from django.contrib.auth.decorators import login_required from .models import Company, Employer @login_required def listing_employer(request): # 查询当前用户关联的公司,不存在直接返回None company = Company.objects.filter(user=request.user).first() # 仅当公司存在时查询关联雇主,不存在则返回空查询集 employers = Employer.objects.filter(company=company) if company else Employer.objects.none() context = { "employers": employers, "company": company, } return render(request, "list_employer.html", context)
如果习惯用try/except写法,注意异常类必须写模型名
Company.DoesNotExist,不能写实例变量名。
2. 修复模板层瑕疵
给社交链接加非空判断,修正按钮类型、url标签多余空格问题,原有条件判断逻辑在视图修复后可正常运行:
{% if company %} {% for employer in employers %} <div class="col-lg-6 mb-4" data-aos="fade-up" data-aos-delay="100"> <div class="member d-flex align-items-start"> <div class="pic"><img src="{{ employer.image.url }}" class="img-fluid" alt="" style="height: 150px; width: 150px"></div> <div class="member-info"> <h4>{{ employer.name }}</h4> <span>{{ employer.funcion }}</span> <div class="social"> {% if employer.facebook %} <a href="{{ employer.facebook }}"><i class="ri-facebook-fill"></i></a> {% endif %} {% if employer.instagram %} <a href="{{ employer.instagram }}"><i class="ri-instagram-fill"></i></a> {% endif %} </div> </div> </div> <a href="/employers/{{ employer.id }}/update/"><button type="button" class="btn btn-success">Editar</button></a> <a href="/employers/{{ employer.id }}/delete/"><button type="button" class="btn btn-danger">Eliminar</button></a> </div> {% empty %} <h1>Nao tem empregados ainda ...</h1> <div class="d-flex align-items-center justify-content-center"> <a href="{% url 'create-employer' %}"><button type="button" class="btn btn-success">Adicionar Empregado</button></a> </div> {% endfor %} <div class="d-flex align-items-center justify-content-center"> <a href="{% url 'create-employer' %}"><button type="button" class="btn btn-success">Adicionar Empregado</button></a> </div> {% else %} <h1>E necessario ter uma pagina para adicionar empregados</h1> <a href="/companies/"><button type="button" class="btn btn-success">A minha pagina</button></a> {% endif %}
注意:不在form标签内的按钮不要写
type="submit",用type="button"即可,避免误触发表单提交行为;url标签前后不要加多余空格,防止路径解析异常。
3. 后续开发注意
编写雇主创建、编辑、删除视图时,必须先校验当前用户是否持有对应公司主体,雇主关联公司时直接绑定当前用户的公司实例,不要让前端传参指定公司,避免跨用户篡改数据。
内容的提问来源于stack exchange,提问作者Francisco Torres
相关产品推荐
相关产品推荐

