我是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')
我希望每当管理员单击“分配”按钮时,该团队就会显示给该经理。
答案 0 :(得分:0)
您的代码有几个问题。
Create_Team
到manager
模型没有任何关系。name
标签上的<select>
属性与您用来从request.POST
读取的密钥不匹配。 manager_{{manager.id}}
呈现为manager_
,因此int(request.POST.get('manager', 1))
将始终返回1。selected
上设置属性<option>
。因此,将始终选择第一选择。让我们解决这些问题。
1-我们通过在ForeignKey
和CreateTeam
之间添加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
的{{1}}和{{1}的CreateTeam
}您要将其分配给。
请注意,表单字段的id
属性是Manager
中的键。这些可以是任何字符串,只要确保它在表单和视图之间匹配即可。给他们一个表达性的名字显然使生活变得很辛苦。
2-{{1}}处理name
中request.POST
的发送。只需确保id
属性与您在视图中使用的键匹配即可。
3-要发送团队Manager
,您可以使用带有名称和值的<select>
来代替name
。
id
或者,您可以使用隐藏字段。
4-最后,您必须在<button type="submit">
中正确的<input type="submit">
上设置属性<button class="btn btn-raised btn-primary btn-round waves-effect" type="submit" name="team" value="{{ team.id }}">Assign</button>
</td>
。您可以这样做:
selected
这是完整的模板:
<option>
5-收到POST请求后,您可以将经理分配给团队。
这意味着您必须使用<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>
实例。然后,将id
分配给CreateTeam
并保存Manager
对象。
Manager
有三件事值得强调:
createteam.manager
代替createteam
。顾名思义,如果找不到模型,它将返回404。对于边缘情况(例如用户操作表单或在用户打开页面时删除管理器),这可以作为简单的错误处理。可以改进此错误处理以使其更加用户友好,但这只是一个开始。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
以外的团队。get_object_or_404
页。这是一个好习惯,可确保用户可以重新加载页面而不会看到teams
对话框。最后,请确保该视图实际上只能由管理员访问,例如通过添加适当的user_passes_test
装饰器。