Проблема 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"
в представлении.