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

Программы на Python
Ответить
Anonymous
 Django UpdateView не сохраняет новое значение

Сообщение Anonymous »

У меня есть приложение-форум, его структура: «форум-подфорум-тема-комментарий». Темы являются эксклюзивными для своего подфорума, комментарии являются эксклюзивными для своей темы и отображаются только внутри темы. Представления реализуются в основном через представления на основе классов.
При создании новой темы необходимо определить не только тему поля, но и начальную комментарий, first_comment. Он очень похож на объекты модели Comment, но фактически является частью модели Topic.
Итак, проблема в том, что, хотя мой UpdateView для комментарии (

Код: Выделить всё

UpdateComment
) работает хорошо, и комментарии редактируются без каких-либо проблем, 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»