Django:解除用户分配后如何重定向至带Usecase ID的详情页
Django解除用户分配后无法重定向回用例详情页的问题
现有两个视图:
view_usecase_details(request, ucid):接收用例ID(ucid)参数,负责展示该用例的已分配用户列表,处理分配新用户的POST请求,渲染UsecaseDetails.html模板。unassign_emp(request, eid):接收用户邮箱(eid)参数,负责从UsecaseAssign表中删除指定用户的关联记录。
当前需求是解除用户分配后,重定向回对应用例的详情页面,但解除分配视图无法获取并传递ucid参数,导致无法正确重定向。
相关代码
模型代码
class User(models.Model): user_email = models.CharField(primary_key=True, max_length=100) user_role_id = models.CharField(max_length=20) user_password = models.CharField(max_length=20) user_name = models.CharField(max_length=100) class Usecase(models.Model): usecase_id = models.CharField(primary_key=True, max_length=20) usecase_name = models.CharField(max_length=256) user_email = models.ForeignKey('User', models.DO_NOTHING, db_column='user_email') usecase_type = models.ForeignKey('UsecaseType', models.DO_NOTHING) class UsecaseAssign(models.Model): usecase_assign_date = models.DateTimeField(primary_key=True, auto_now_add=True) usecase = models.ForeignKey(Usecase, models.DO_NOTHING) user_email = models.ForeignKey('User', models.DO_NOTHING, db_column='user_email') usecase_role_id = models.CharField(max_length=20)
视图代码
@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').values_list('user_email__user_name').filter(usecase_id=ucid) user_assigned = UsecaseAssign.objects.values_list('user_email').filter(usecase_id=ucid) 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, "user already added!") return HttpResponseRedirect(reverse('usecase-details', args=[ucid])) else: userAssignObj = UsecaseAssign.objects.create(user_email_id=user_email, usecase_id=ucid) if userAssignObj: messages.success(request, "User was Successfully Assigned with Usecase!") return HttpResponseRedirect(reverse('usecase-details', args=[ucid])) context = {'usecase_details': usecase_details, "users": User.objects.all(), 'usecase_assigned':usecase_assigned, "users": users, "user_assigned": user_assigned} return render(request, 'UsecaseDetails.html', context) @user_login_required def unassign_emp(request, eid): if request.method=='POST' and 'unassign_emp' in request.POST: unassign_emp = UsecaseAssign.objects.get(user_email=eid) unassign_emp.delete() messages.success(request, "User was unassigned with Usecase!") return redirect('usecase-details') # 此处无法传递ucid参数
模板代码
{% 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' ucid=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">Assign new users:</label> <select name="user_email" class="custom-select my-1 mr-sm-2" id="user"> <option value="0" selected>Select</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="Submit Changes"> </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">Assigned users:</label> {% for user in usecase_assigned %} <p>{{user|join:', '}}</p> {% endfor %} {% for unassign in user_assigned %} <form action="{% url 'unassign_emp' unassign %}" method="POST" style="display: inline !important;"> {% csrf_token %} <input type="submit" class="btn btn-primary" name="unassign_emp" value="Delete"> </form> {% endfor %} </div> </div> </li> </ul> </div> {% endfor %}
URL配置
path('usecase-details/<str:ucid>', av.view_usecase_details, name="usecase-details"), path('unassign-emp/<str:eid>/', av.unassign_emp, name="unassign_emp"),
解决方案
1. 修改URL配置,添加ucid参数
更新解除分配的URL,使其同时接收用户邮箱和用例ID:
path('unassign-emp/<str:eid>/<str:ucid>/', av.unassign_emp, name="unassign_emp"),
2. 更新模板表单,传递ucid
在模板的解除分配表单中,将当前用例ID传递给URL:
{% for unassign in user_assigned %} <form action="{% url 'unassign_emp' unassign result.usecase_id %}" method="POST" style="display: inline !important;"> {% csrf_token %} <input type="submit" class="btn btn-primary" name="unassign_emp" value="Delete"> </form> {% endfor %}
3. 修改视图函数,接收ucid并完成重定向
更新unassign_emp视图,接收ucid参数,删除对应记录后重定向到用例详情页,同时优化删除逻辑避免异常:
@user_login_required def unassign_emp(request, eid, ucid): if request.method=='POST' and 'unassign_emp' in request.POST: # 过滤指定用户和用例的关联记录,避免误删其他用例的分配 UsecaseAssign.objects.filter(user_email=eid, usecase_id=ucid).delete() messages.success(request, "User was unassigned with Usecase!") return redirect('usecase-details', ucid=ucid)
内容的提问来源于stack exchange,提问作者JHS99
相关产品推荐
相关产品推荐

