Django UpdateView не сохраняет новое значение

У меня есть приложение для форума, его структура - «форум-подфорум-топик-коммент». Темы являются эксклюзивными для своего подфорума, комментарии являются эксклюзивными для своей темы и отображаются только внутри темы. Представления реализованы в основном через class-based-views.

При создании нового Topic необходимо определить не только поле subject, но и начальный комментарий first_comment. Он довольно похож на объекты модели Comment, но фактически является частью модели Topic.

Итак, проблема в том, что в то время как мой UpdateView для комментариев (UpdateComment) работает хорошо, и комментарии редактируются без проблем, UpdateView для first_comment объекта Topic, хотя и не возвращает ошибки, не редактирует поле (страница отображается, работает, терминал даже показывает некоторое количество данных рядом с кодом 200 - но содержимое поля остается прежним).

И это печально. Вы знаете, это очень грустно, когда вы делаете это так, как это должно работать, кажется, что это должно работать, вы тратите много времени, чтобы заставить это работать, но это отказывается работать по любой причине.

models.py (только модели Topic и Comment):

class Topic(models.Model):
    subject = models.CharField(verbose_name='Заголовок', max_length=255, unique=True)
    first_comment = models.TextField(verbose_name='Сообщение', max_length=2000, default='')
    slug = models.SlugField(default='', unique=True, max_length=25, editable=False)
    subforum = models.ForeignKey('Subforum', verbose_name='Раздел',
                                 on_delete=models.CASCADE, related_name='subforum')
    creator = models.ForeignKey(User, verbose_name='Создатель темы',
                                on_delete=models.SET('deleted'), related_name='creator')
    created = models.DateTimeField(auto_now_add=True)
    closed = models.BooleanField(default=False)
    objects = models.Manager()

    class Meta:
        ordering = ['id']
        verbose_name = 'Обсуждения'
        verbose_name_plural = 'Обсуждения'

    def __str__(self):
        return self.subject

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = f'topic-{slugify(self.subject)}'
            return super(Topic, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('forum:topic', kwargs={'topic_slug': self.slug, 'subforum_slug': self.subforum.slug})


class Comment(models.Model):
    topic = models.ForeignKey('Topic', verbose_name='Тема', on_delete=models.CASCADE, 
                              related_name='comments')
    author = models.ForeignKey(User, verbose_name='Комментатор',
                               on_delete=models.SET('deleted'), related_name='author')
    content = models.TextField(verbose_name='Текст', max_length=2000)
    created = models.DateTimeField(verbose_name='Дата публикации', auto_now_add=True)
    updated = models.DateTimeField(verbose_name='Дата изменения', auto_now=True)
    objects = models.Manager()

    class Meta:
        ordering = ['created']
        verbose_name = 'Комментарии'
        verbose_name_plural = 'Комментарии'

    def __str__(self):
        return f'Post of {self.topic.subject} is posted by {self.author.username}.'

views.py (ShowTopic, AddTopic, UpdateFirstComment и UpdateComment для сравнения):

urls.py

app_name = 'forum'

urlpatterns = [
    path('', SubForumListView.as_view(), name='forum'),
    path('<slug:subforum_slug>/', TopicListView.as_view(), name='subforum'),
    path('<slug:subforum_slug>/add_topic/', AddTopic.as_view(), name="add_topic"),
    path('<slug:subforum_slug>/topics/<slug:topic_slug>/', ShowTopic.as_view(), name='topic'),
    path('<slug:subforum_slug>/topics/<slug:topic_slug>/edit_topic/', UpdateFirstComment.as_view(), name='edit_topic'),
    path('<slug:subforum_slug>/topics/<slug:topic_slug>/add_comment/', AddComment.as_view(), name="add_comment"),
    path('<slug:subforum_slug>/topics/<slug:topic_slug>/<int:pk>/edit_comment/', UpdateComment.as_view(), name="edit_comment"),
    path('<slug:subforum_slug>/topics/<slug:topic_slug>/<int:pk>/delete_comment/', DeleteComment.as_view(), name="delete_comment"),
]

Если для лучшего понимания контекста необходимо что-то еще, пожалуйста, сообщите мне.

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