Урлы Django указывают неверный путь
Я пишу приложение для управления производственными машинами и столкнулся со странной проблемой, которую не могу решить.
Ранее у меня была подстраница "Сделки" с путями под одноименным описанием. Все работало очень хорошо.
Сегодня я попытался добавить еще одну подстраницу, "Сделки на человека", и началась проблема.
# Transaction
path('transaction/machines', views.transaction_machines_list_view, name="transaction_machines_list"),
path('transaction/machine/<int:id>', views.transaction_list_view, name="transaction_list"),
# Transaction per-Capita
path('per_capita/employees', views.transaction_per_capita_employees_list_view, name="transaction_per_capita_employees_list"),
path('per_capita/employee/<int:id>', views.transaction_per_capita_list_view, name="transaction_per_capita_list"),
Все пути "транзакции" работают хорошо, per_capita/employees тоже работает хорошо, но когда я пытаюсь достичь последнего, например,
http://127.0.0.1:8000/per_capita/employee/2
Я столкнулся со следующей ошибкой
NoReverseMatch at /per_capita/employee/2
Reverse for 'transaction_list' with keyword arguments '{'id': ''}' not found. 1 pattern(s) tried: ['transaction/machine/(?P<id>[0-9]+)$']
Почему мой путь с именем transaction_per_capita_list воспринимается Django как transaction_list? Само перенаправление является строкой в таблице и выглядит следующим образом:
<tr class="pointer" onclick="location.href='{% url 'transaction_per_capita_list' id=employee.id %}';">
<td class="cell">{{ employee.username }}</td>
<td class="cell">{{ employee.first_name }}</td>
<td class="cell">{{ employee.last_name }}</td>
</tr>
Эти 2 представления (feom views.py) выглядят так:
# /per_capita/employees
@login_required
@permission_required('mes.view_transactionpercapita', raise_exception=True)
def transaction_per_capita_employees_list_view(request):
data = {
'employees': Employee.get_all()
}
return render(request, 'transaction_percap/employee_list.html', { 'data': data })
# /per_capita/employee/id
@login_required
@permission_required('mes.view_transactionpercapita', raise_exception=True)
def transaction_per_capita_list_view(request, id):
employee = Employee.get_by_id(id)
if request.GET.get('search'):
transactions = TransactionPerCapita.find(employee, request.GET.get('search'))
else:
transactions = TransactionPerCapita.get_all(employee)
paginator = Paginator(transactions, 15)
page_number = request.GET.get('page') if request.GET.get('page') else 1
transactions_page = paginator.get_page(page_number)
paginator = {
'actual_page': page_number,
'has_next': transactions_page.has_next(),
'has_prev': transactions_page.has_previous(),
'last_page': paginator.num_pages
}
if paginator['has_next']:
paginator['next_page'] = transactions_page.next_page_number()
if paginator['has_prev']:
paginator['prev_page'] = transactions_page.previous_page_number()
data = {
'employee': employee,
'transactions': transactions_page,
'paginator': paginator,
'search': request.GET.get('search')
}
return render(request, 'transaction_percap/list.html', { 'data': data })
Я пробовал изменить путь, я пробовал переименовать его, но это ничего не дает. Что я делаю не так?
Я только что понял, что я сделал.
Это не было проблемой с моими урлами или чем-то еще, и эта ошибка была 100% правильной. В шаблоне, который я пытался отобразить, у меня было несколько ссылок, используемых paginator, вот так:
<li class="page-item">
<a class="page-link" href="{% url 'transaction_list' id=data.machine.id %}?page={{ data.paginator.prev_page }}&search={{ data.search | default_if_none:'' }}">
Previous page
</a>
</li>
Как вы можете видеть, он указывает transaction_list, но у меня нет data.machine в этом представлении, поэтому оно выдает ошибку. Я очень извиняюсь за это, я не знал, что это так глупо :D