首页 > 解决方案 > 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')

我希望每当管理员单击分配按钮时,该团队将显示给该经理。请帮助我。

标签: htmldjangodjango-modelsdjango-templatesdjango-views

解决方案


您的代码有几个问题。

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

让我们解决这些问题。

ForeignKey1 - 我们通过添加from CreateTeamto 来修复模型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您要分配的。CreateTeamidManager

请注意,name表单字段的属性是 中的键request.POST。这些可以是任何字符串,只要确保它在表单和视图之间匹配即可。显然,给他们一个富有表现力的名字会让生活变得更加美好。

2 - 发送idManager处理<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实例。然后你分配Managercreateteam.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})

有三点值得强调:

  1. 我们使用get_object_or_404而不是Model.objects.get. 顾名思义,如果找不到模型,它会返回 404。这可作为对边缘情况的简单错误处理,例如用户操作表单或在用户打开页面时删除管理器。这种错误处理可以改进为更加用户友好,但这是一个开始。
  2. get_object_or_404可以采用模型或查询集。我们从过滤后的查询集中加载团队实例teams。否则,用户可以操作表单并将经理分配给状态不是 的团队Accept
  3. 保存团队后,我们重定向到accept页面。这是一种很好的做法,可确保用户可以在不看到do you want to resubmit this form对话框的情况下重新加载页面。

最后,确保这个视图实际上只有管理员可以访问,例如通过添加适当的user_passes_test装饰器。


推荐阅读