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 в качестве первичного ключа (не редактируемого)

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

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