У меня возникли некоторые проблемы с направлением шаблона URL через путь следующего типа: Listview -> Listview2 -> DetailView. У меня проблемы с шаблонами URL. Вот с чем я работаю:
app_name = 'ism'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<slug:client_slug>/', views.CostCenterListView.as_view(), name='cost_center_list'),
path('<slug:client_slug>/<slug:cost_center_slug>/', views.cost_center_detail, name='cost_center_detail'),
]
Домашняя страница этого приложения представляет собой список всех клиентов. При нажатии на клиента откроется новая страница со списком суб-клиентов этого клиента (cost_center).
Вот часть моего шаблона {% url%} вызова моего последнего пути, указанного выше (/ slug / slug /):
{% for cost_center in cost_centers %}
<ul>
<li><a href="{% url 'ism:cost_center_detail' cost_center.slug %}">{{ cost_center }}</a></li>
</ul>
{% endfor %}
Добавление этого вместе с сопровождающим его представлением вызывает ошибку:
NoReverseMatch at /ism/cleint_slug/
Можете ли вы подтвердить, что моя проблема связана с моим {% url%} в моем шаблоне, не помня первого слага в моем пути URL? Кажется, мое сообщение об ошибке указывает на то, что он пытается найти:
.../cost_center_slug
вместо:
.../client_slug/cost_center_slug/
Я предполагаю, что django волшебным образом запомнит первую часть моего шаблона URL (то есть client_slug), но этого, похоже, не происходит. Нужно ли вводить больше контекстных переменных в моем представлении, чтобы можно было вызывать две переменные url (также является ли переменная url правильной терминологией? Это неправильно звучит) в моем шаблоне выше?
Вот мое полное сообщение об ошибке («cffd» - это слаг, представляющий центр затрат):
Reverse for 'cost_center_detail' with arguments '('cffd',)' not found.
1 pattern(s) tried:
['ism/(?P<client_slug>[-a-zA-Z0-9_]+)/(?P<cost_center_slug>[-a-zA-Z0-9_]+)/$']
Вот мои views.py. Сначала я пытался работать с DetailView и его методом get_object, но я не мог заставить это работать в дополнение к основанному на функции представлению, которое я показал
class IndexView(generic.ListView):
template_name = 'ism/index.html'
context_object_name = 'client_list'
def get_queryset(self):
queryset = Client.objects.all()
return queryset
class CostCenterListView(generic.ListView):
template_name = 'ism/costcenter_list.html'
context_object_name = 'cost_centers'
def get_queryset(self):
slug = self.kwargs.get('client_slug')
client = Client.objects.get(slug=slug)
queryset = client.costcenter_set.all()
return queryset
def cost_center_detail(request, client_slug, cost_center_slug):
cost_center = get_object_or_404(CostCenter, slug=cost_center_slug)
context = {'cost_center': cost_center}
return render(request, 'ism/costcenter_detail.html', context)