Reputation: 69
I have a UpdateView for editing a post, but instead of making a DeleteView for delete a post, i try to make UpdateView include a function to delete the post. So ,i want to edit and delete a post in UpdateView. Is that possible ? i think i missing something in my code so the code keep getting error.
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 %}
Upvotes: 0
Views: 1676
Reputation: 31
This is a bit of an old post, but I figured to answer since I solved this problem.
Just utilize the DeletionMixin
module from django.generic.edit
file.
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)
The DeletionMixin
will import its delete
function and handle the rest. Make sure to overwrite the post
function or all POST requests will result in deletion.
Upvotes: 2
Reputation: 11665
You can override post
method to make it work like below
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)
Upvotes: 0
Reputation: 963
The line def form_valid(self, form, pk):
should be def form_valid(self, form):
. The docs don't have form_valid as taking a pk argument. You can get the pk using: form.instance.pk
instead.
EDIT:
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)
Upvotes: 0