Тег URL-адреса Django не работает - NoReverseMatch

Я знаю, что мы не должны использовать stackoverflow для отладки, но я пытался исправить это последние 10 часов, и я чувствую себя безнадежным, мои извинения.

#main project urls.py:
urlpatterns = [
    ...
    path('accounts/',include('employee.urls')),
    ...
]...

#employee.urls:
urlpatterns = [
    ...
    path('employees/', views.display_employees),
    path('edit/<str:employee_ssn>/', views.edit_employee),
    ...
]

#views.py - edit_employee being used only for testing by now
def display_employees(request):
    logged_user = request.user
    queryset = Employee.objects.filter(company=logged_user.company)
    context = {
        'employees': queryset
    }
    return render(request, 'employees.html', context)

def edit_employee(request, employee_ssn):
    context = {}
    emp = Employee.objects.filter(ssn=employee_ssn)
    
    context = {
        'employee_list': emp
    }
    return render(request, 'edit-employee.html', context)

#employees.html
<ul>
    {% for obj in employees %}
    <li>{{ obj.name }}</li>
    <li>{{ obj.ssn }}</li>
    <li>{{ obj.email }}</li>
    <li><a href="{% url '/accounts/edit/' obj.ssn %}">edit</a></li><br>
    {% endfor %}
</ul>

#edit-employee.html
<ul>
{% for obj in employee_list %}
    <li>{{ obj.name }}</li>
    <li>{{ obj.ssn }}</li>
    <li>{{ obj.email }}</li>
{% endfor %}
</ul>

При нажатии на edit он говорит:

Тип исключения: NoReverseMatch Значение исключения: Реверс для '/ accounts / edit /' не найден. '/ accounts / edit /' не является допустимой функцией просмотра или именем шаблона.

Но если URL-адрес http://localhost:8000/accounts/edit/<employee_snn>/ вводится в браузере, edit-employee.html отображается нормально. Также говорится, что ошибка находится в моем базовом шаблоне в строке 0.


person Lucas VB    schedule 29.09.2020    source источник


Ответы (1)


Вы не можете использовать шаблон в {% url … %} тег шаблона [Django-doc]. Вы должны дать представлению имя, а затем использовать его для разрешения URL-адреса, поэтому:

urlpatterns = [
    # …
    path('employees/', views.display_employees),
    path('edit/<str:employee_ssn>/', views.edit_employee, name='edit-employee'),
    # …
]

а затем вы можете использовать это как параметр в теге {% url … %}:

<li><a href="{% url 'edit-employee' obj.ssn %}">edit</a></li><br>

Идея использования тега {% url … %} заключается в том, что вы можете легко изменить шаблоны путей. Пока имя и параметры остаются прежними, он по-прежнему сможет разрешить путь к шаблону.

person Willem Van Onsem    schedule 29.09.2020
comment
Я пробовал что-то вроде этого, просто добавляя имя представления, я также добавлял шаблон в тег url. Большое спасибо - person Lucas VB; 29.09.2020