Привет: я пытаюсь создать каталог персонала, в котором пользователь может фильтровать представление по отделам.У меня есть список отделов, отображаемый в выпадающей кнопке, но я не могу понять, как правильно передать выбор пользователя в просмотр списка в 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'])