В моем существующем представлении я пытаюсь добавить представление фильтра (по полю «Sprint» в Issue - работает в модели Issue в качестве внешнего ключа). Ниже мой код:
#models.py
class Sprint(models.Model):
sprint_type = models.TextField(default='Sprint', editable=False)
name = models.TextField()
goal = models.TextField()
start_date = models.DateField()
end_date = models.DateField()
project = models.ForeignKey(Project, on_delete=models.CASCADE)
class Issue(models.Model):
ISSUE_PRIORITY = (
('Critical', 'Critical'),
('High', 'High'),
('Medium', 'Medium'),
('Low', 'Low'),
)
issue_type = models.TextField(default='Issue', editable=False)
issue_id = models.AutoField(primary_key=True)
# slug = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
date_created = models.DateTimeField(auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
title = models.CharField(max_length=128)
description = models.TextField(null=True, blank=True)
initiative = models.ForeignKey(Initiative, on_delete=models.CASCADE, null=True, blank=True)
epic = models.ForeignKey(Epic, null=True, blank=True, on_delete=models.CASCADE)
sprint = models.ForeignKey(Sprint, on_delete=models.CASCADE, null=True, blank=True)
priority = models.CharField(max_length=8, choices=ISSUE_PRIORITY, default='M')
Я использую библиотеку django-filter.
#filters.py
import django_filters
from .models import Issue
class BacklogFilter(django_filters.FilterSet):
sprint = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Issue
fields = ['sprint']
Используя представление на основе классов, я определил:
class ProjectBacklogView(DetailView):
model = Project
template_name = 'project-backlog.html'
context_object_name = 'backlog'
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
return ListView.dispatch(self, request, *args, **kwargs)
def get_queryset(self):
try:
self.filter = BacklogFilter(self.request.GET, queryset=Issue.objects.all())
return self.filter
except:
return Issue.objects.all()
def get_context_data(self, **kwargs):
context = super(ProjectBacklogView, self).get_context_data(**kwargs)
context['project'] = Project.objects.all()
context['issue'] = Issue.objects.all()
# context['epic'] = Epic.objects.all()
# context['initiative'] = Initiative.objects.all()
context['sprint'] = Sprint.objects.all()
context['filter_form'] = self.filter.form.as_table
return context
In urls.py:
path('<str:pk>/backlog/', ProjectBacklogView.as_view(), name='project-backlog'),
path('<str:pk>/backlog/(\w+)/', ProjectBacklogView.as_view(), name='project-backlog-filter'),
И, что не менее важно, шаблон:
{% extends 'base-project.html' %}
{% block content %}
<div class="container-fluid">
<div id="simpleList" class="list-group">
{% for issue in backlog.issue_set.all %}
<div class="list-group-item">
<div style="float:left;"><strong><a href="{% url 'issue-edit' issue.pk %}">{{ issue.title }}</a></strong></div>
<div style="float: right;"><a href="#" class="btn btn-success btn-circle btn-sm"><i class="fas">{{ issue.remaining_estimate }}</i></a></div>
<br /><br /><hr style="border-top: dashed 1px;"></hr>
<div style="float: left;"><small>Assignee: <strong>{{ issue.assignee }}</strong></small></div>
<div style="float: right;"><small>Initiative: <strong>{{ issue.initiative }}</strong></small></div><br />
<div style="float: left;"><small>Priority: <strong>{{ issue.priority }}</strong></small></div>
<div style="float: right;"><small>Epic: <strong>{{ issue.epic }}</strong></small></div>
</div>
{% endfor %}
</div>
<!-- Filters form-->
<div>
<form action="" method="get" class="filter-form">
<table>
{{ filter_form }}
</table>
<input type="submit" value="Szukaj" />
<a class="reset-form" href="{% url 'project-backlog' project.pk %}">Clean filters</a>
</form>
</div>
</div>
Моя проблема заключается в том, что я получаю сообщение об ошибке «нет атрибута« фильтр »в BacklogFilter». Также меня беспокоит маршрутизация URL-адресов - в моем случае я хотел бы, чтобы в существующей в данный момент форме отображалась пользовательская форма фильтрации и после применения выбранного фильтра, ограничить отображаемые элементы в соответствии с выбранным / примененным фильтром. Как я могу этого добиться? Я читаю тонны руководств, но всегда выясняю, что у пользователя есть форма фильтрации, и после отправки формы пользователь перенаправляется на совершенно другую страницу: (
Заранее большое спасибо за вашу помощь, я знаю, что мне еще нужно многому научиться ..