У меня есть UpdateView для редактирования сообщения, но вместо того, чтобы создать DeleteView для удаления сообщения, я пытаюсь включить в UpdateView функцию для удаления сообщения. Итак, я хочу отредактировать и удалить сообщение в UpdateView. Это возможно ? Я думаю, что мне что-то не хватает в моем коде, поэтому код продолжает получать ошибку.
form_valid() missing 1 required positional argument: 'pk'
views.py
class PostUpdate(LoginRequiredMixin,generic.UpdateView):
model = PostModel
fields = ['title','file','description']
template_name = 'post/post_update.html'
success_url = reverse_lazy('user_profile:profile')
def form_valid(self, form, pk):
if 'confirm_post' in self.request.POST:
form.instance.user = self.request.user
elif 'confirm_delete' in self.request.POST:
post_delete = PostModel.objects.get(pk = id)
post_delete.delete()
return super(PostUpdate, self).form_valid(form)
urls.py
from django.conf.urls import url
from . import views
from django.urls import path
app_name = 'post'
urlpatterns = [
url('user_post/', views.PostView.as_view(), name= 'user_post'),
url('post_list/', views.PostList.as_view(), name='post_list'),
path('<int:pk>', views.PostDetail.as_view(), name= 'post_detail'),
path('update/<int:pk>/', views.PostUpdate.as_view(), name= 'post_update'),
]
post_update.html
{% extends 'base.html'%}
{% load bootstrap3%}
{% block content %}
<form method = "POST" enctype = "multipart/form-data">
{% csrf_token %}
{% bootstrap_form form%}
<input type = "submit" name = "confirm_post" value = "Confirm">
<input type = "submit" name = "confirm_delete" value = "Delete">
</form>
{% endblock %}
@ Bott0610 form_valid () отсутствует 1 обязательный позиционный аргумент: 'pk'
Линия def form_valid(self, form, pk):
должна быть def form_valid(self, form):
. Документы не имеет form_valid как принимающий аргумент pk. Вместо этого вы можете получить pk, используя: form.instance.pk
.
Обновлено:
class PostUpdate(LoginRequiredMixin,generic.UpdateView):
model = PostModel
fields = ['title','file','description']
template_name = 'post/post_update.html'
success_url = reverse_lazy('user_profile:profile')
def form_valid(self, form):
if 'confirm_post' in self.request.POST:
form.instance.user = self.request.user
elif 'confirm_delete' in self.request.POST:
pk = form.instance.pk
post_delete = PostModel.objects.get(pk=pk)
post_delete.delete()
# Or just one line: form.instance.delete()
return super(PostUpdate, self).form_valid(form)
Спасибо за ответ, но как использовать form.instance.pk в моем views.py?
Спасибо, теперь моя ошибка исчезла, но я все еще не могу удалить сообщение, сообщение все еще остается там после удаления.
Возможно, проверьте свои данные POST на «confirm_delete»?
Вы можете переопределить метод post
, чтобы он работал, как показано ниже.
class PostUpdate(LoginRequiredMixin,generic.UpdateView):
model = PostModel
fields = ['title','file','description']
template_name = 'post/post_update.html'
success_url = reverse_lazy('user_profile:profile')
def post(self, request, pk):
if 'confirm_delete' in self.request.POST:
post_delete = PostModel.objects.get(pk=pk)
post_delete.delete()
return super(PostUpdate, self).post(request, pk)
def form_valid(self, form):
if 'confirm_post' in self.request.POST:
form.instance.user = self.request.user
return super(PostUpdate, self).form_valid(form)
Спасибо @Anjaneyulu Batta, теперь моя функция удаления работает нормально! но form_valid для обновления не работает, он просто возвращается к странице user_profile без каких-либо ошибок, но содержимое остается неизменным, даже если я его редактирую.
@giamzengkeat Да, верно. Это не сработает. потому что у него есть дополнительный параметр «pk». Я обновил ответ. Теперь он должен работать.
На самом деле я замечаю лишний «pk» перед запуском кода, поэтому я удаляю его перед запуском, но, к сожалению, form_valid (self, form) для обновления не обновил изменения успешно, он просто вернулся к success_url. Но удаление работает нормально, и я редактирую return super (PostUpdate, self) .form_valid (form) для возврата перенаправления ("user_profile: profile"), поэтому он будет перенаправлен на страницу профиля после удаления. Тем не менее, спасибо за помощь!
если я использую обновленный код, ничего не меняя, form_valid для обновления работает нормально, а функция удаления - нет. но если я изменю return super (PostUpdate, self) .post (request, pk) на возврат перенаправления ("user_profile: profile") в функции удаления, удаление будет работать нормально, но обновление больше не будет работать должным образом. Есть подсказка?
Это немного старый пост, но я решил ответить, так как решил эту проблему.
Просто используйте модуль DeletionMixin
из файла django.generic.edit
.
from django.views.generic.edit import LoginRequiredMixin, UpdateView, DeletionMixin
class PostUpdate(LoginRequiredMixin, DeletionMixin, UpdateView):
model = PostModel
fields = ['title','file','description']
template_name = 'post/post_update.html'
success_url = reverse_lazy('user_profile:profile')
def post(self, request, *args, **kwargs):
if "confirm_delete" in self.request.POST:
return self.delete(request, *args, **kwargs)
def form_valid(self, form, pk):
if 'confirm_post' in self.request.POST:
form.instance.user = self.request.user
return super(PostUpdate, self).form_valid(form)
DeletionMixin
импортирует свою функцию delete
и выполнит все остальное. Обязательно перезапишите функцию post
, иначе все запросы POST приведут к удалению.
он игнорирует функцию обновления при переопределении сообщения. Невозможно понять, как это исправить
Что или где вы получаете ошибку?