Django: как отобразить конкретный объект для конкретного пользователя - PullRequest
1 голос
/ 06 мая 2019

Я новичок в 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 голосов
/ 06 мая 2019

Есть несколько проблем с вашим кодом.

  1. Нет связи между Create_Team и manager моделью.
  2. Атрибут name на вашем *Теги 1009 * не соответствуют ключу, который вы используете для чтения с request.POST.manager_{{manager.id}} отображается как manager_, поэтому int(request.POST.get('manager', 1)) всегда будет возвращать 1.
  3. Формы в вашем шаблоне не содержат информацию о том, какую команду вы хотите обновить.
  4. Вы не делаетеустановите атрибут selected на любой <option>.Как следствие, всегда будет выбран первый вариант.
  5. Вы не обновляете ни одной команды по вашему мнению.

Давайте рассмотрим эти проблемы.

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 из CreateTeam, который вы хотите назначить, иid из Manager, которому вы хотите присвоить его.

Обратите внимание, что атрибут name полей формы является ключом в request.POST.Это может быть любая строка, просто убедитесь, что она совпадает между формой и представлением.Очевидно, что жизнь дает им выразительное имя.

2 - Отправка id из Manager обрабатывается <select>.Просто убедитесь, что атрибут name соответствует ключу, который вы используете в своем представлении.

3 - Чтобы отправить id команды, вы можете использовать <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>

В качестве альтернативы, вы можете использовать скрытое поле.

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})

Выделите три вещи:

  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 декоратор.

...