Anonymous
Django UpdateView не сохраняет новое значение
Сообщение
Anonymous » 08 ноя 2024, 00:07
У меня есть приложение-форум, его структура: «форум-подфорум-тема-комментарий». Темы являются эксклюзивными для своего подфорума, комментарии являются эксклюзивными для своей темы и отображаются только внутри темы. Представления реализуются в основном через представления на основе классов.
При создании новой темы необходимо определить не только тему поля, но и начальную комментарий, first_comment. Он очень похож на объекты модели Comment, но фактически является частью модели Topic.
Итак, проблема в том, что, хотя мой UpdateView для комментарии (
) работает хорошо, и комментарии редактируются без каких-либо проблем, UpdateView для объектов first_comment Topic, хотя и не возвращает ошибок, не редактирует поле (страница отображается, это работает, терминал даже показывает некоторый объем данных рядом с кодом 200, но содержимое поля остается прежним).
models.py (только модели «Тема» и «Комментарий»):< /p>
Код: Выделить всё
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):
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 для сравнения):
Код: Выделить всё
class ShowTopic(DetailView):
model = Topic
template_name = "forum/topic.html"
slug_url_kwarg = 'topic_slug'
context_object_name = 'topic'
paginate_by = 5
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
topic = self.get_object()
comments_list = Comment.objects.filter(topic=topic).order_by('created')
paginator = Paginator(comments_list, self.paginate_by)
page_number = self.request.GET.get('page', 1)
page_obj = paginator.get_page(page_number)
context.update({
'menu': menu,
'comments': page_obj,
'page_obj': page_obj,
'is_paginated': page_obj.has_other_pages(),
'paginator': paginator,
'comm_num': comments_list.count(),
})
return context
class AddTopic(LoginRequiredMixin, DataMixin, CreateView):
form_class = AddTopicForm
template_name = 'forum/addtopic.html'
page_title = 'Create a new topic'
def get_success_url(self):
return reverse('forum:topic', kwargs={
'subforum_slug': self.kwargs['subforum_slug'], 'topic_slug': self.object.slug})
def form_valid(self, form):
subforum = Subforum.objects.get(slug=self.kwargs['subforum_slug'])
form.instance.creator = self.request.user
form.instance.subforum = subforum
return super(AddTopic, self).form_valid(form)
class AddComment(LoginRequiredMixin, DataMixin, CreateView):
model = Comment
form_class = AddCommentForm
template_name = 'forum/addcomment.html'
page_title = 'Leave a comment'
def get_success_url(self):
return reverse('forum:topic', kwargs={
'subforum_slug': self.kwargs['subforum_slug'],
'topic_slug': self.kwargs['topic_slug']})
def form_valid(self, form):
topic = Topic.objects.get(slug=self.kwargs['topic_slug'])
form.instance.author = self.request.user
form.instance.topic = topic
return super(AddComment, self).form_valid(form)
class UpdateFirstComment(LoginRequiredMixin, DataMixin, UpdateView):
model = Topic
form_class = AddTopicForm
template_name = 'forum/editcomment.html'
page_title = 'Edit comment'
def get_success_url(self):
return reverse('forum:topic', kwargs={
'subforum_slug': self.kwargs['subforum_slug'],
'topic_slug': self.kwargs['topic_slug']
})
def get_object(self, queryset=None):
return Topic.objects.get(slug=self.kwargs['topic_slug'], subforum__slug=self.kwargs['subforum_slug'])
def form_valid(self, form):
topic = self.get_object()
first_comment = topic.first_comment
form.instance.creator = self.request.user
form.instance.topic = topic
form.instance.first_comment = first_comment
return super(UpdateFirstComment, self).form_valid(form)
class UpdateComment(LoginRequiredMixin, DataMixin, UpdateView):
model = Comment
form_class = AddCommentForm
context_object_name = 'comment'
template_name = 'forum/editcomment.html'
page_title = 'Edit comment'
def get_success_url(self):
return reverse('forum:topic', kwargs={
'subforum_slug': self.kwargs['subforum_slug'],
'topic_slug': self.kwargs['topic_slug']
})
urls.py
Код: Выделить всё
app_name = 'forum'
urlpatterns = [
path('', SubForumListView.as_view(), name='forum'),
path('/', TopicListView.as_view(), name='subforum'),
path('/add_topic/', AddTopic.as_view(), name="add_topic"),
path('/topics//', ShowTopic.as_view(), name='topic'),
path('/topics//edit_topic/', UpdateFirstComment.as_view(), name='edit_topic'),
path('/topics//add_comment/', AddComment.as_view(), name="add_comment"),
path('/topics///edit_comment/', UpdateComment.as_view(), name="edit_comment"),
path('/topics///delete_comment/', DeleteComment.as_view(), name="delete_comment"),
]
Если для лучшего понимания контекста необходимо что-то еще, сообщите мне.
Подробнее здесь:
https://stackoverflow.com/questions/791 ... -new-value
1731013657
Anonymous
У меня есть приложение-форум, его структура: «форум-подфорум-тема-комментарий». Темы являются эксклюзивными для своего подфорума, комментарии являются эксклюзивными для своей темы и отображаются только внутри темы. Представления реализуются в основном через представления на основе классов. При создании новой темы необходимо определить не только тему поля, но и начальную комментарий, first_comment. Он очень похож на объекты модели Comment, но фактически является частью модели Topic. Итак, проблема в том, что, хотя мой UpdateView для комментарии ([code]UpdateComment[/code]) работает хорошо, и комментарии редактируются без каких-либо проблем, UpdateView для объектов first_comment Topic, хотя и не возвращает ошибок, не редактирует поле (страница отображается, это работает, терминал даже показывает некоторый объем данных рядом с кодом 200, но содержимое поля остается прежним). models.py (только модели «Тема» и «Комментарий»):< /p> [code]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): 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}.' [/code] views.py (ShowTopic, AddTopic, UpdateFirstComment и UpdateComment для сравнения): [code]class ShowTopic(DetailView): model = Topic template_name = "forum/topic.html" slug_url_kwarg = 'topic_slug' context_object_name = 'topic' paginate_by = 5 def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) topic = self.get_object() comments_list = Comment.objects.filter(topic=topic).order_by('created') paginator = Paginator(comments_list, self.paginate_by) page_number = self.request.GET.get('page', 1) page_obj = paginator.get_page(page_number) context.update({ 'menu': menu, 'comments': page_obj, 'page_obj': page_obj, 'is_paginated': page_obj.has_other_pages(), 'paginator': paginator, 'comm_num': comments_list.count(), }) return context class AddTopic(LoginRequiredMixin, DataMixin, CreateView): form_class = AddTopicForm template_name = 'forum/addtopic.html' page_title = 'Create a new topic' def get_success_url(self): return reverse('forum:topic', kwargs={ 'subforum_slug': self.kwargs['subforum_slug'], 'topic_slug': self.object.slug}) def form_valid(self, form): subforum = Subforum.objects.get(slug=self.kwargs['subforum_slug']) form.instance.creator = self.request.user form.instance.subforum = subforum return super(AddTopic, self).form_valid(form) class AddComment(LoginRequiredMixin, DataMixin, CreateView): model = Comment form_class = AddCommentForm template_name = 'forum/addcomment.html' page_title = 'Leave a comment' def get_success_url(self): return reverse('forum:topic', kwargs={ 'subforum_slug': self.kwargs['subforum_slug'], 'topic_slug': self.kwargs['topic_slug']}) def form_valid(self, form): topic = Topic.objects.get(slug=self.kwargs['topic_slug']) form.instance.author = self.request.user form.instance.topic = topic return super(AddComment, self).form_valid(form) class UpdateFirstComment(LoginRequiredMixin, DataMixin, UpdateView): model = Topic form_class = AddTopicForm template_name = 'forum/editcomment.html' page_title = 'Edit comment' def get_success_url(self): return reverse('forum:topic', kwargs={ 'subforum_slug': self.kwargs['subforum_slug'], 'topic_slug': self.kwargs['topic_slug'] }) def get_object(self, queryset=None): return Topic.objects.get(slug=self.kwargs['topic_slug'], subforum__slug=self.kwargs['subforum_slug']) def form_valid(self, form): topic = self.get_object() first_comment = topic.first_comment form.instance.creator = self.request.user form.instance.topic = topic form.instance.first_comment = first_comment return super(UpdateFirstComment, self).form_valid(form) class UpdateComment(LoginRequiredMixin, DataMixin, UpdateView): model = Comment form_class = AddCommentForm context_object_name = 'comment' template_name = 'forum/editcomment.html' page_title = 'Edit comment' def get_success_url(self): return reverse('forum:topic', kwargs={ 'subforum_slug': self.kwargs['subforum_slug'], 'topic_slug': self.kwargs['topic_slug'] }) [/code] urls.py [code]app_name = 'forum' urlpatterns = [ path('', SubForumListView.as_view(), name='forum'), path('/', TopicListView.as_view(), name='subforum'), path('/add_topic/', AddTopic.as_view(), name="add_topic"), path('/topics//', ShowTopic.as_view(), name='topic'), path('/topics//edit_topic/', UpdateFirstComment.as_view(), name='edit_topic'), path('/topics//add_comment/', AddComment.as_view(), name="add_comment"), path('/topics///edit_comment/', UpdateComment.as_view(), name="edit_comment"), path('/topics///delete_comment/', DeleteComment.as_view(), name="delete_comment"), ] [/code] Если для лучшего понимания контекста необходимо что-то еще, сообщите мне. Подробнее здесь: [url]https://stackoverflow.com/questions/79167297/django-updateview-doesnt-save-a-new-value[/url]