Html Django:如何向特定用户显示特定对象
我是django的新手,在一个项目中,管理员必须将团队分配给经理,当管理员将团队分配给经理时,它将仅显示给特定的经理。我不知道如何才能做到这一点。如果有人能帮忙,请帮帮我 这是我的.html文件,管理员可以从中将团队分配给经理Html Django:如何向特定用户显示特定对象,html,django,django-models,django-templates,django-views,Html,Django,Django Models,Django Templates,Django Views,我是django的新手,在一个项目中,管理员必须将团队分配给经理,当管理员将团队分配给经理时,它将仅显示给特定的经理。我不知道如何才能做到这一点。如果有人能帮忙,请帮帮我 这是我的.html文件,管理员可以从中将团队分配给经理 <thead> <tr> <th>S No.</th> <th>COMPANY NAME</th> <th>TEAM MEMBER</th> &
<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 %}
这是适用于manager的my 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\u团队
与经理
模型之间没有关系
标记上的名称
属性与用于从请求中读取的密钥不匹配。POST
manager{{manager.id}
呈现为manager
,因此int(request.POST.get('manager',1))
将始终返回1
上设置属性已选
。因此,将始终选择第一选择CreateTeam
中的ForeignKey
添加到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
视图:要分配的CreateTeam
的id
和要分配的Manager
的id
请注意,表单字段的name
属性是request.POST
中的键。这些可以是任何字符串,只要确保它在窗体和视图之间匹配即可。很明显,给他们一个富有表现力的名字会让生活变得更美好
2-发送管理器的id
由
处理。只需确保name
属性与视图中使用的键匹配即可
3-要发送团队的id
,可以使用带有名称和值的
而不是
以下是完整的模板:
<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>
有三件事值得强调:
我们使用get\u object\u或
而不是Model.objects.get
。顾名思义,如果找不到模型,它将返回404。这可以作为边缘情况的简单错误处理,例如用户操作表单或在用户打开页面时删除管理器。这种错误处理可以改进为更加用户友好,但这只是一个开始
获取对象或404
可以获取模型或查询集。我们从过滤后的querysetteams
加载团队实例。否则,用户可以操纵表单并将经理分配给状态不是Accept
的团队
保存团队后,我们重定向到accept
页面。这是一种很好的做法,可以确保用户可以重新加载页面,而不会看到是否要重新提交此表单
对话框
最后,确保只有管理员才能访问此视图,例如,通过添加适当的装饰程序。您的代码存在几个问题
Create\u团队
与经理
模型之间没有关系
标记上的名称
属性与用于从请求中读取的密钥不匹配。POST
manager{{manager.id}
呈现为manager
,因此int(request.POST.get('manager',1))
将始终返回1
模板中的表单不包含要更新的团队的信息
您不会在任何
上设置属性已选
。因此,将始终选择第一选择
您没有更新视图中的任何团队
让我们来解决这些问题
1-我们通过将CreateTeam
中的ForeignKey
添加到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
视图:要分配的CreateTeam
的id
和要分配的Manager
的id
请注意,表单字段的name
属性是request.POST
中的键。这些可以是任何字符串,只要确保它在窗体和视图之间匹配即可。很明显,给他们一个富有表现力的名字会让生活变得更美好
2-发送管理器的id
由
处理。只需确保name
属性与视图中使用的键匹配即可
3-要发送团队的id
,可以使用带有名称和值的
而不是
以下是完整的模板:
<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>
有三件事值得强调:
我们使用get\u object\u或
而不是Model.objects.get
。顾名思义,如果找不到模型,它将返回404。这可以作为边缘情况的简单错误处理,例如用户操作表单或在用户打开页面时删除管理器。这种错误处理可以改进为更加用户友好,但这只是一个开始
获取对象或404
可以获取模型或查询集。我们从过滤后的querysetteams
加载团队实例。否则,用户可以操纵表单并将经理分配给状态不是Accept
<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>
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})