Django:如何向特定用户显示特定对象

时间:2019-05-06 07:18:36

标签: html django django-models django-templates django-views

我是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')

我希望每当管理员单击“分配”按钮时,该团队就会显示给该经理。

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题。

  1. Create_Teammanager模型没有任何关系。
  2. name标签上的<select>属性与您用来从request.POST读取的密钥不匹配。 manager_{{manager.id}}呈现为manager_,因此int(request.POST.get('manager', 1))将始终返回1。
  3. 模板中的表单不包含您要更新的团队的信息。
  4. 您没有在任何selected上设置属性<option>。因此,将始终选择第一选择。
  5. 您没有更新视图中的任何团队。

让我们解决这些问题。

1-我们通过在ForeignKeyCreateTeam之间添加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}}处理namerequest.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

有三件事值得强调:

  1. 我们使用createteam.manager代替createteam。顾名思义,如果找不到模型,它将返回404。对于边缘情况(例如用户操作表单或在用户打开页面时删除管理器),这可以作为简单的错误处理。可以改进此错误处理以使其更加用户友好,但这只是一个开始。
  2. 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以外的团队。
  3. 保存小组后,我们重定向到get_object_or_404页。这是一个好习惯,可确保用户可以重新加载页面而不会看到teams对话框。

最后,请确保该视图实际上只能由管理员访问,例如通过添加适当的user_passes_test装饰器。