html - Django:如何向特定用户显示特定对象
问题描述
我是 django 的新手,正在从事一个项目,管理员必须将一个团队分配给经理,并且当管理员将一个团队分配给经理时,它只会显示给该特定的经理。我不知道我该怎么做。请如果有人可以帮助请帮助我。
这是我的 .html 管理员文件,管理员可以在其中将团队分配给经理。
<thead>
<tr>
<th>S No.</th>
<th>COMPANY NAME</th>
<th>TEAM MEMBER</th>
<th>EMAIL</th>
<th>ASSIGN TEAM</th>
</tr>
</thead>
<tbody>
{%for team in object%}
<tr>
<form id="form_id" method="POST" action = "{% url 'accept' %}">
{% csrf_token %}
<th scope="row"> {{ forloop.counter }}</th>
<td>{{team.company_name}}</td>
<td>{{team.team_member}}</td>
<td>{{team.email}}</td>
<td>
<select name="manager_{{manager.id}}">
{% for manager in managers %}
<option value ="{{manager.id}}">{{manager.name}}</option>
{% endfor %}
</select>
</td>
<td>
<input class="btn btn-raised btn-primary btn-round waves-effect" type="submit" value="Assign">
</td>
</tr>
{% endfor %}
这是我的团队和经理模型:
class Create_Team(models.Model):
first_name = models.CharField(max_length= 50)
last_name = models.CharField(max_length= 50)
company_name = models.CharField(max_length= 100)
address = models.CharField(max_length= 1000)
state = models.CharField(max_length= 100)
city = models.CharField(max_length= 100)
status = models.CharField(max_length= 30)
class manager(models.Model):
name = models.CharField(max_length= 500)
designation = models.CharField(max_length= 500)
这是我的经理views.py文件,管理员从那里接受请求:
def accept(request):
obj= Create_Team.objects.filter(status='Accept')
managers = manager.objects.all()
if request.method == 'POST':
acc = manager()
manager_id = int(request.POST.get('manager', 1))
acc.manager = manager.objects.get(pk=manager_id)
return render(request, "admin/accept.html", {"object": obj, "managers": managers})
def superior(request):
return render(request, 'manager/index-3.html')
我希望每当管理员单击分配按钮时,该团队将显示给该经理。请帮助我。
解决方案
您的代码有几个问题。
Create_Team
与模型没有关系manager
。- 标签上的
name
属性与<select>
您用来读取的键不匹配request.POST
。manager_{{manager.id}}
呈现为manager_
,因此int(request.POST.get('manager', 1))
将始终返回 1。 - 您模板中的表格不包含您要更新的团队的信息。
- 您没有
selected
在任何<option>
. 因此,将始终选择第一个选项。 - 您没有更新您视图中的任何团队。
让我们解决这些问题。
ForeignKey
1 - 我们通过添加from CreateTeam
to 来修复模型Manager
。请注意,我已重命名模型,这是可选的。如果您决定保留您的姓名,请相应地进行调整。
# models.py
from django.db import models
class CreateTeam(models.Model):
first_name = models.CharField(max_length= 50)
last_name = models.CharField(max_length= 50)
company_name = models.CharField(max_length= 100)
address = models.CharField(max_length= 1000)
state = models.CharField(max_length= 100)
city = models.CharField(max_length= 100)
status = models.CharField(max_length= 30)
manager = models.ForeignKey('Manager', on_delete=models.SET_NULL, null=True, blank=True)
class Manager(models.Model):
name = models.CharField(max_length= 500)
designation = models.CharField(max_length= 500)
您必须将两位信息传递给assign
视图:您要分配的 和id
您要分配的。CreateTeam
id
Manager
请注意,name
表单字段的属性是 中的键request.POST
。这些可以是任何字符串,只要确保它在表单和视图之间匹配即可。显然,给他们一个富有表现力的名字会让生活变得更加美好。
2 - 发送id
由Manager
处理<select>
。只需确保name
属性与您在视图中使用的键匹配即可。
3 - 要发送id
团队的 ,您可以使用<button type="submit">
带有名称和值的 a 而不是<input type="submit">
。
<button class="btn btn-raised btn-primary btn-round waves-effect" type="submit" name="team" value="{{ team.id }}">Assign</button>
</td>
或者,您可以使用隐藏字段。
4 - 最后,您必须selected
在. 你可以这样做:<option>
<select>
<option value="{{manager.id}}" {% if team.manager.id == manager.id %}selected{% endif %}
这是完整的模板:
<html>
<head></head>
<body>
<table>
<thead>
<tr>
<th>S No.</th>
<th>COMPANY NAME</th>
<th>TEAM MEMBER</th>
<th>EMAIL</th>
<th>ASSIGN TEAM</th>
</tr>
</thead>
<tbody>
{%for team in teams%}
<tr>
<form id="form_id" method="POST" action="{% url 'accept' %}">
{% csrf_token %}
<th scope="row"> {{ forloop.counter }}</th>
<td>{{team.company_name}}</td>
<td>{{team.team_member}}</td>
<td>{{team.email}}</td>
<td>
<select name="manager">
{% for manager in managers %}
<option value="{{manager.id}}" {% if team.manager.id == manager.id %}selected{% endif %}>{{manager.name}}</option>
{% endfor %}
</select>
</td>
<td>
<button class="btn btn-raised btn-primary btn-round waves-effect" type="submit" name="team" value="{{ team.id }}">Assign</button>
</td>
</form>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
5 - 收到 POST 请求时,您可以将经理分配给团队。这意味着您必须使用这些id
值来获取CreateTeam
实例和Manager
实例。然后你分配Manager
到createteam.manager
并保存createteam
对象。
from django.shortcuts import get_object_or_404, redirect, render
from .models import CreateTeam, Manager
def accept(request):
teams = CreateTeam.objects.filter(status='Accept')
managers = Manager.objects.all()
if request.method == 'POST':
createteam_id = int(request.POST.get('team', 1))
manager_id = int(request.POST.get('manager', 1))
createteam = get_object_or_404(teams, pk=createteam_id)
createteam.manager = get_object_or_404(Manager, pk=manager_id)
createteam.save()
redirect('accept')
return render(request, "admin/accept.html", {"teams": teams, "managers": managers})
有三点值得强调:
- 我们使用
get_object_or_404
而不是Model.objects.get
. 顾名思义,如果找不到模型,它会返回 404。这可作为对边缘情况的简单错误处理,例如用户操作表单或在用户打开页面时删除管理器。这种错误处理可以改进为更加用户友好,但这是一个开始。 get_object_or_404
可以采用模型或查询集。我们从过滤后的查询集中加载团队实例teams
。否则,用户可以操作表单并将经理分配给状态不是 的团队Accept
。- 保存团队后,我们重定向到
accept
页面。这是一种很好的做法,可确保用户可以在不看到do you want to resubmit this form
对话框的情况下重新加载页面。
最后,确保这个视图实际上只有管理员可以访问,例如通过添加适当的user_passes_test
装饰器。
推荐阅读
- mercurial - 确实需要两个杰出的分支中的两个头
- php - 单元测试:如何防止执行内置 PHP 函数
- pandas - 将数据汇总到不同年份的一个点并将它们绘制在图表中
- reactjs - 在 React 应用程序中定义除默认 env 文件外的 .env 文件
- android - "Unresolved reference: Parcelize" after updating to Kotlin 1.3.30
- django - 使用 Swagger 记录具有多个响应的 DRF GET 端点
- awk - 匹配两个文件中的 valueS 并在选定的列中替换
- python - 将 input() 分配给变量时出现 NameError (Python2.7.11)
- latex - 如何在双盲评审过程中删除作者姓名和隶属关系?
- c# - 是否有一种简单的方法可以在 Visual Studio 中注释许多类和方法