Django 2.1 вспоминает старые переменные URL-адреса - PullRequest
0 голосов
/ 29 октября 2018

У меня возникли некоторые проблемы с направлением шаблона 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)

1 Ответ

0 голосов
/ 29 октября 2018

Я думаю, что вы ошиблись URL. Это должно быть либо

{% url 'ism:cost_center_list' client_slug %}

или (у вас недостаточно аргументов для построения cost_center_detail url)

{% url 'ism:cost_center_detail' client_slug cost_center.slug %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...