Django用例解分配功能实现问题:URL错误与参数传递
问题解决方案
问题1:Reverse for 'usecase-details' 错误修复
原因:unassign_emp视图执行redirect('usecase-details')时,未传递URL配置要求的ucid参数,导致路由匹配失败。
问题2:模板无法正确传递user_email 修复
原因:
usecase_assigned查询仅获取了用户名,未保留用户邮箱字段,无法传递给解分配视图- 模板错误使用
result.user_email(属于Usecase模型字段,而非当前分配用户的邮箱)
修改后的视图代码
@user_login_required def view_usecase_details(request, ucid): usecase_details = Usecase.objects.filter(usecase_id=ucid).all() usecase_details = usecase_details.prefetch_related("usecaseids") users = User.objects.all() # 调整查询,同时获取用户邮箱和用户名 usecase_assigned = UsecaseAssign.objects.select_related('user_email')\ .filter(usecase_id=ucid)\ .values('user_email__user_email', 'user_email__user_name') if request.method=='POST' and 'assignuser' in request.POST: user_email = request.POST['user_email'] userAssignCheck = UsecaseAssign.objects.filter(user_email=user_email, usecase_id=ucid) if userAssignCheck: messages.error(request, "用户已被分配!") return HttpResponseRedirect(reverse('usecase-details', args=[ucid])) else: # usecase_role_id为必填字段,需设置默认值或从表单获取,此处用DEFAULT_ROLE示例 userAssignObj = UsecaseAssign.objects.create( user_email_id=user_email, usecase_id=ucid, usecase_role_id="DEFAULT_ROLE" ) if userAssignObj: messages.success(request, "用户分配成功!") return HttpResponseRedirect(reverse('usecase-details', args=[ucid])) context = { 'usecase_details': usecase_details, "users": users, 'usecase_assigned': usecase_assigned } return render(request, 'UsecaseDetails.html', context) @user_login_required def unassign_emp(request, eid, ucid): if request.method == 'POST': # 同时过滤用户邮箱和用例ID,避免误删其他用例的分配记录 UsecaseAssign.objects.filter(user_email_id=eid, usecase_id=ucid).delete() return redirect('usecase-details', args=[ucid])
修改后的URL代码
path('usecase-details/<str:ucid>', av.view_usecase_details, name="usecase-details"), path('unassign-emp/<str:eid>/<str:ucid>', av.unassign_emp, name="unassign-emp"),
修改后的模板代码
{% for result in usecase_details %} <div class="card card-body shadow-sm mb-4 mb-lg-0"> <form class="mb-card" action="{% url 'usecase-details' result.usecase_id %}" method="POST"> {% csrf_token %} <div class="form-row mb-4"> <div class="col-lg-8 mr-f"> <label class="h5" for="user_email">分配新用户:</label> <select name="user_email" class="custom-select my-1 mr-sm-2" id="user"> <option value="0" selected>选择用户</option> {% for user in users %} <option value="{{ user.user_email }}">{{ user.user_name }}</option> {% endfor %} </select> </div> </div> <input type="submit" class="btn btn-primary" name="assignuser" value="提交"> </form> <ul class="list-group list-group-flush"> <li class="list-group-item d-flex align-items-center justify-content-between px-0 border-bottom"> <div> <label class="mb-card h5" for="user_email">已分配用户:</label> {% for assigned in usecase_assigned %} <form action="{% url 'unassign-emp' assigned.user_email__user_email result.usecase_id %}" method="POST" style="display: inline !important;"> {% csrf_token %} <div class="btn-group me-2 mb-2"> <button type="button" class="btn btn-outline-danger">{{ assigned.user_email__user_name }}</button> <button type="submit" class="btn btn-danger" > <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-file-x-fill" viewBox="0 0 16 16"> <path d="M12 0H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h8a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2zM6.854 6.146 8 7.293l1.146-1.147a.5.5 0 1 1 .708.708L8.707 8l1.147 1.146a.5.5 0 0 1-.708.708L8 8.707 6.854 9.854a.5.5 0 0 1-.708-.708L7.293 8 6.146 6.854a.5.5 0 1 1 .708-.708z"></path> </svg> </button> </form> </div> {% endfor %} </div> </li> </ul> </div> {% endfor %}
额外说明
- 模型中
usecase_role_id为必填字段,创建分配记录时必须提供值,代码中使用DEFAULT_ROLE作为示例,可根据业务需求调整为表单输入或其他默认值。 - 模板中使用
{% url %}标签生成URL,替代硬编码路径,提升代码可维护性。 - 解分配逻辑中同时过滤
user_email_id和usecase_id,确保仅删除当前用例下目标用户的分配记录,匹配你期望的执行逻辑。
内容的提问来源于stack exchange,提问作者JHS99
相关产品推荐
相关产品推荐

