Django UpdateView создает новый объект вместо обновления существующего
У меня возникла проблема с моим представлением обновления в Django. Хотя я вижу правильные данные в форме обновления (т.е. GET-запрос предварительно заполняет форму содержимым существующей статьи), при отправке формы исходная статья не обновляется - вместо этого создается новая статья с новым uid, а исходная остается с прежним uid.
Я убедился, что:
Мое представление обновления инициализирует ModelForm существующим экземпляром с помощью параметра instance.
Моя конфигурация URL включает первичный ключ (uid) в URL.
Ниже приведена упрощенная версия моего кода.
views.py:
from django.shortcuts import render, get_object_or_404, redirect
from .models import Article
from .forms import ArticleForm
def ArticleUpdate(request, pk):
# Fetch the existing article using the uid passed via URL
article = get_object_or_404(Article, uid=pk)
if request.method == 'POST':
# IMPORTANT: The form is instantiated with the existing instance!
form = ArticleForm(request.POST, request.FILES, instance=article)
if form.is_valid():
form.save() # Expect this to update, not create a new article
return redirect('article-read', pk=article.uid)
else:
print("Form errors:", form.errors)
else:
form = ArticleForm(instance=article)
context = {'form': form}
return render(request, 'blog/article_form.html', context)
urls.py:
from django.urls import path
from blog import views
urlpatterns = [
path('articles/create/', views.ArticleCreate, name='article-create'),
path('articles/<str:pk>/', views.ArticleRead, name='article-read'),
path('articles/<str:pk>/update/', views.ArticleUpdate, name='article-update'),
]
Шаблон (article_form.html):
{% extends 'base.html' %}
{% block content %}
<h2>{% if form.instance.pk %}Update{% else %}Create{% endif %} Article</h2>
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">{% if form.instance.pk %}Update{% else %}Create{% endif %}</button>
</form>
{% endblock %}
Я перепроверил:
Форма отправлена на правильный URL (URL обновления с пк статьи).
Представление всегда передает существующий экземпляр форме при POST.
Нет дублирующего шаблона URL, который мог бы случайно направить POST к моему представлению create.
Несмотря на все это, отправка формы приводит к созданию новой статьи, а не к обновлению исходной.
Что я пробовал:
Убедитесь, что URL-адрес в браузере содержит правильный пк.
Добавьте операторы печати в представление для подтверждения загрузки правильного экземпляра.
Убедитесь, что поля формы корректны и что первичный ключ модели (поле UUID) не подлежит редактированию.
Кто-нибудь сталкивался с таким поведением? Может ли это быть проблемой шаблона (например, жестко закодированный атрибут действия, из-за которого POST попадает не в то представление), или есть что-то еще, что я могу упустить?
Любые рекомендации будут высоко оценены.
Окружение:
Django 5.2
Python 3.12
Модель статьи использует UUIDField в качестве первичного ключа (не редактируемого)
Заранее спасибо!