You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 %}

额外说明

  1. 模型中usecase_role_id为必填字段,创建分配记录时必须提供值,代码中使用DEFAULT_ROLE作为示例,可根据业务需求调整为表单输入或其他默认值。
  2. 模板中使用{% url %}标签生成URL,替代硬编码路径,提升代码可维护性。
  3. 解分配逻辑中同时过滤user_email_id和usecase_id,确保仅删除当前用例下目标用户的分配记录,匹配你期望的执行逻辑。

内容的提问来源于stack exchange,提问作者JHS99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 09:37:07