Reputation: 82
views.py:
class NewsCommentsUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Comment
fields = ('comment',)
template_name = 'news/comment_edit.html'
def get_absolute_url(self):
return reverse_lazy('news_detail', args=[str(self.object.news.id)])
def get(self, request):
return Comment.objects.get(pk_news=self.request.GET.get('news_id'), pk=self.request.GET.get('id'))
def test_func(self):
obj = self.get_object()
if self.request.user.has_perm('news.all') or self.request.user.has_perm('news.delete_news') or obj.author == self.request.user:
return True
urls.py:
path('<int:pk_news>/comment_edit/<int:pk>/', NewsCommentsUpdateView.as_view(), name='comment_edit'),
path('<int:pk_news>/comment-delete/<int:pk>/', NewsCommentsDeleteView.as_view(), name='comment_delete'),
template:
{% for comment in object.comments.all %}
<a href="{% url 'comment_edit' pk_news=news.pk pk=comment.pk %}">Edit</a> |
<a href="{% url 'comment_delete' pk_news=news.pk pk=comment.pk %}">Delete</a>
{% endfor %}
It does not work and gives me an error (get() got an unexpected keyword argument 'pk_news').
Upvotes: 1
Views: 566
Reputation: 477704
The url parameters are passed to the get
(post
, put
, etc.) functions. Since these do not belong to the query string [wiki], these are thus not in the request.GET
.
You thus process these with:
class NewsCommentsUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Comment
fields = ('comment',)
template_name = 'news/comment_edit.html'
def get_absolute_url(self):
return reverse_lazy('news_detail', args=[str(self.object.news.id)])
def get(self, request, pk_news, pk):
return Comment.objects.get(pk_news=pk_news, pk=pk)
def test_func(self):
obj = self.get_object()
return self.request.user.has_perm('news.all') or \
self.request.user.has_perm('news.delete_news') or \
obj.author == self.request.user
Your get
, post
, etc. requests should return a HttpResponse
object not a model object. You thus should process this item accordingly. Likely you want this to be the .get_object()
method. In that case you access the URL parameters with self.kwargs
:
class NewsCommentsUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Comment
fields = ('comment',)
template_name = 'news/comment_edit.html'
def get_absolute_url(self):
return reverse_lazy('news_detail', args=[str(self.object.news.id)])
def get_object(self, *__, **___):
return Comment.objects.get(pk_news=self.kwargs['pk_news'], pk=self.kwargs['pk'])
def test_func(self):
obj = self.get_object()
return self.request.user.has_perm('news.all') or \
self.request.user.has_perm('news.delete_news') or \
obj.author == self.request.user
Upvotes: 2