Проблема NoReverseMatch с классом UpdateView в Django

Я пытаюсь создать представление обновления в django, наследуя UpdateView. Мое представление выглядит следующим образом:

class UpdateStudentView(UpdateView):
    model = Student
    form_class = StudentForm
    template_name = "students/students_update.html"
    success_url = reverse_lazy("students:students")

Это представление принимает первичный ключ студента в качестве аргумента из url

    path("update/<uuid:pk>/", UpdateStudentView.as_view(), name="update_student"),

А вот шаблон, который должен взять этот primary_key из url и передать его в view.

{% block content %}
        <form action="{% url "students:update_student" pk %}" method="post"> {% csrf_token %}
            {{ form.as_p }}
            <button type="submit">Submit</button>
        </form>
{% endblock content %}

Однако он не работает и выбрасывает NoReverseMatch:

NoReverseMatch at /students/update/primary_key_here/
Reverse for 'update_student' with arguments '('',)' not found. 1 pattern(s) tried: ['students/update/(?P<pk>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/\\Z']

Могли бы вы объяснить мне, почему это происходит и как я могу избежать этой ошибки?

Пожалуйста, не говорите мне об использовании pk_url_kwarg = 'pk', поскольку по умолчанию это 'pk'

Заранее спасибо!

Это:

path("update/<uuid:pk>/", UpdateStudentView.as_view(), name="update_student"),

означает, что VIEW принимает pk kwarg, а не шаблон. В шаблоне он пока пустой, если только вы не поместите его в контекст (именно поэтому Django пока ищет урлы с пустым аргументом). В действии update вам не нужно помещать action="" внутрь формы, потому что кнопка submit автоматически сделает то, что вам нужно от UpdateView (потому что у вас установлено success_url).

PS вы должны использовать object.pk или student.pk, если у вас есть context_object_name="student" в представлении.

Вернуться на верх