Django 2.0.5 отображает другой результат запроса с помощью списка CBV - PullRequest
0 голосов
/ 25 сентября 2018

Привет: я пытаюсь создать каталог персонала, в котором пользователь может фильтровать представление по отделам.У меня есть список отделов, отображаемый в выпадающей кнопке, но я не могу понять, как правильно передать выбор пользователя в просмотр списка в views.py. См. Код ниже.

models.py

class Department(models.Model):
  department = models.CharField(max_length = 20, unique = True)
 def __str__(self):
    return self.department

class EmployeeList(models.Model):
  department = models.ForeignKey(Department, on_delete = models.SET_NULL, null = True, blank = True)

views.py

class EmployeeOutput(ListView):
  model = models.EmployeeList
  context_object_name = 'employee_list'
  template_name = 'employee_list.html'

def get_context_data(self, **kwargs):
    context = super(EmployeeOutput, self).get_context_data(**kwargs)
    context['filter_list'] = models.Department.objects.values_list('department', flat = True)
    return context

class FilterDepartment(ListView):
  model = models.EmployeeList
  context_object_name = 'employee_list'
  template_name = 'employee_list.html'

  def get_context_data(self, **kwargs):
    context = super(FilterDepartment, self).get_context_data(**kwargs)
    context['filter_list'] = models.Department.objects.values_list('department', flat = True)
    context['department_filter'] = models.EmployeeList.objects.filter(department_id = 3)
    return context

employee_list.html

<table class = 'table table-striped table-hover' id = 'my_table'>
        <thead>
          <tr>
            <th><button type="button" class = ' btn btn-info' onclick = 'sortTable(0)'>Name</button></th>
            <th><button type="button" class = ' btn btn-info' onclick = 'sortTableNumbers(1)'>Phone Ex</button></th>
            <th><button type="button" class = ' btn btn-info' onclick = 'sortTable(2)'>Email</button></th>
            <th>
              <div class="btn-group dropright">
                <button class="btn btn-success dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                  Department
                </button>
                <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                  <a class="dropdown-item" onclick = 'sortTable(3)'><b>Sort Department</b></a>
                  <h6 class="dropdown-header">Filter by:</h6>
                  <div class="dropdown-divider"></div>
                  {% for running in filter_list%}
                    <a class="dropdown-item" href="{% url 'employee:department_filter' %}"><b>{{running}}</b></a>
                  {% endfor %}
                </div>
              </div>
            </th>
            <th><button type="button" class = ' btn btn-info' onclick = 'sortTable(4)'>Remote Access</button></th>
            <th>Cell Phone</th>
          </tr>
        </thead>
        <tbody>
          {% if department_filter %}
            {% for EL in department_filter %}
              <tr>
                <td>{{EL.first_name}} {{EL.last_name}}</td>
                <td>{{EL.phone_ex}}</td>
                <td> <a href="mailto:{{EL.email}}">{{EL.email}}</a></td>
                <td>{{EL.department}}</td>
                <td>{{EL.remote_access}}</td>
                <td>{{EL.cell}}</td>
              </tr>
            {% endfor %}
          {% else %}
            {% for EL in employee_list %}
              <tr>
                <td>{{EL.first_name}} {{EL.last_name}}</td>
                <td>{{EL.phone_ex}}</td>
                <td> <a href="mailto:{{EL.email}}">{{EL.email}}</a></td>
                <td>{{EL.department}}</td>
                <td>{{EL.remote_access}}</td>
                <td>{{EL.cell}}</td>
              </tr>
            {% endfor %}
          {% endif %}
        </tbody>
      </table>

Я могу правильно отобразить весь персонал с помощью'employee_list.Я могу показать список текущего отдела в выпадающей кнопке с 'filter_list'.Когда пользователь щелкает по любой из выборок, он всегда показывает один и тот же результат, так как 'Department_list' жестко запрограммирован на Department_id = 3. Мне нужно выяснить, как передать идентификатор с помощью href как

{% url 'employee:department_filter' dept=running.id %}

с url.py

path('filter/<int:dept>', views.FilterDepartment.as_view(), name = 'department_filter'),

Я изо всех сил пытаюсь выяснить, как передать команду dept в представление FilterDepartment.Возможно, есть лучший способ сделать это, или я просто пропускаю последний кусок, чтобы это произошло.Любое предложение приветствуется.Спасибо

предложение от @ dirkgroten

employee_list.html

  <a class="dropdown-item" href="{% url 'employee:department_filter' dept=running.id %}"><b>{{running}}</b></a>
          {% if object_list %}
            {% for EL in object_list %}
              <tr>
                <td><a href="{% url 'employee:employee_update' pk=EL.pk %}">{{EL.first_name}} {{EL.last_name}}</a></td>
                <td>{{EL.phone_ex}}</td>
                <td> <a href="mailto:{{EL.email}}">{{EL.email}}</a></td>
                <td>{{EL.department}}</td>
                <td>{{EL.remote_access}}</td>
                <td>{{EL.cell}}</td>
              </tr>
            {% endfor %}

urls.py

path('filter/<int:dept>/', views.FilterDepartment.as_view(), name = 'department_filter'),

views.py

class FilterDepartment(ListView):
model = models.EmployeeList
context_object_name = 'employee_list'
template_name = 'employee_list.html'

def get_context_data(self, **kwargs):
    context = super(FilterDepartment, self).get_context_data(**kwargs)
    context['filter_list'] = models.Department.objects.values_list('department', flat = True)
    return context

def get_queryset(self, **kwargs):
    return super().get_queryset().filter(department_id=self.kwargs['dept'])

рабочее решение:

employee_list.html

{% for running in filter_list%}
                    <a class="dropdown-item" href="{% url 'employee:department_filter' running %}"><b>{{running}}</b></a>
                  {% endfor %}
  {% if object_list %}
            {% for EL in object_list %}
              <tr>
                <td><a href="{% url 'employee:employee_update' pk=EL.pk %}">{{EL.first_name}} {{EL.last_name}}</a></td>
                <td>{{EL.phone_ex}}</td>
                <td> <a href="mailto:{{EL.email}}">{{EL.email}}</a></td>
                <td>{{EL.department}}</td>
                <td>{{EL.remote_access}}</td>
                <td>{{EL.cell}}</td>
              </tr>

urls.py

path('filter/<department>/', views.FilterDepartment.as_view(), name = 'department_filter'),

views.py

class FilterDepartment(ListView):
model = models.EmployeeList
context_object_name = 'employee_list'
template_name = 'employee_list.html'
    #if missing, it is looking for EmployeeList_list.html
    #employee_list.pk used in empllyee_list.html

def get_context_data(self, **kwargs):
    context = super(FilterDepartment, self).get_context_data(**kwargs)
    context['filter_list'] = models.Department.objects.values_list('department', flat = True)
    # context['department_filter'] = models.EmployeeList.objects.filter(department_id = self.kwargs['dept'])
    return context

def get_queryset(self):
    return super(FilterDepartment, self).get_queryset().filter(department__department=self.kwargs['department'])

1 Ответ

0 голосов
/ 26 сентября 2018

Используйте метод ListView get_queryset() для фильтрации списка объектов, которые вы хотите отобразить.Это добавит object_list к контексту в шаблоне.Используйте get_context_data() только для добавления дополнительной информации в контекст.

class FilterDepartment(ListView):
    # properties like model and template_name
    # context_object_name can be used if you want to call the list something else than 'object_list' in your context

    def get_queryset(self):
         return super().get_queryset().filter(department_id=self.kwargs['dept'])

    def get_context_data(self, **kwargs):
         context = super().get_context_data(**kwargs)  # this will already include object_list
         context['filter_list'] = models.Department.objects.values_list('department', flat = True)
         return context

Документация Django на ListView довольно лаконична и затрудняет понимание того, какие методы переопределить.Лучшее место для понимания общих представлений Django на основе классов - здесь .

...