【问题标题】:I am having a problem with Reverse method on comment section for a blog post我在博客文章的评论部分遇到了 Reverse 方法的问题
【发布时间】:2021-04-22 09:40:21
【问题描述】:

我在博客文章的评论部分使用 Reverse 方法时遇到问题。发布部分工作正常,但它的重定向视图不起作用。它向我打招呼:

未找到:/article/17/ [18/Jan/2021 03:38:33] “POST /article/17/HTTP/1.1”404 1747

可能与 id 有关,或者我以错误的方式重定向..

这是我所做的:

views.py

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages

from django.urls import reverse
from django.http import HttpResponseRedirect

from .models import Article
from comments.models import ArticleComment
from comments.forms import ArticleCommentForm

from django.views.generic import (
    ListView,
    DetailView
)



class ArticleListView(ListView):
    model = Article
    template_name = 'articles/home.html'
    context_object_name = 'articles'
    ordering = ['-date_published']
    paginate_by = 5


class ArticleDetailView(DetailView):
    model = Article
    form_class = ArticleCommentForm
    template_name = 'articles/article_detail.html'

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)

        comments = ArticleComment.objects.filter(
            article =self.get_object()
        ).order_by('created_on')

        data['comments'] = comments
        if self.request.user.is_authenticated:
            data['comment_form'] = ArticleCommentForm(instance=self.request.user)

        return data

    def post(self, request, pk, **kwargs):
        article = get_object_or_404(Article, id=request.POST.get('object_id'))
        if request.method == 'POST':
            form = ArticleCommentForm(request.POST)
            if form.is_valid:
                new_comment = form.save(commit=False)
                new_comment = ArticleComment(comment= request.POST.get('comment'),
                                        user = self.request.user,
                                        article = self.get_object())
                new_comment.save()
                messages.success(request, f'Your comment has been posted')
                return reverse(request, 'article-detail', kwargs={id: self.id})
                
        else:
            context = {
                'form': form
            }

        return render(request, 'articles/article_detail.html', context)

models.py

from django.db import models
from django.contrib.auth import settings
from django.utils import timezone
from articles.models import Article



class ArticleComment(models.Model):
    article          = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='Comments')
    user             = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    comment          = models.TextField()
    created_on       = models.DateTimeField(default=timezone.now)
    updated_on       = models.DateTimeField(default=timezone.now)

   

    def __str__(self):
        return  self.article.title[:50] + ' | ' + 'comments by {}' .format(self.user.username)

forms.py

from django import forms
from .models import ArticleComment

class ArticleCommentForm(forms.ModelForm):
    comment = forms.CharField(label ='', widget = forms.Textarea(
        attrs = {
            'class': 'form-control',
            'placeholder': 'Conversations',
            'rows': 4,
            'column': 50
        }))
    class Meta:
        model  = ArticleComment
        fields = ['comment']
        

urls.py

from django.urls import path
from . import views as article_view
from .views import (
    ArticleListView,
    ArticleDetailView
)

urlpatterns = [
    path('', ArticleListView.as_view(), name='home'),
    path('article/<int:pk>/', ArticleDetailView.as_view(), name='article-detail'),
    path('about/', article_view.about, name='about'),
]

【问题讨论】:

  • 最简单的方法是在models.py中添加get_absolute_url
  • 我的models.py中确实有get_absolute_url我如何在函数中实现它
  • 另外注意:..> 我有不同的文章和 cmets 应用程序,我使用评论应用程序的 cmets 模型和表单,以及使用文章应用程序的视图和 url imm。代码很长,所以我决定不发布所有内容。

标签: django redirect comments


【解决方案1】:

而不是使用

return reverse(request, 'article-detail', kwargs={id: self.id})

尝试使用

from django.shortcuts import redirect

....
return redirect('article-detail', id=article.id)

这应该可以正常工作。如果它不起作用,请在问题中发布您的urls.py

【讨论】:

  • 我仍然显示同样的错误。我已经用 urls.py 更新了我的问题
  • 修改了答案。
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 2018-09-12
  • 2013-01-04
  • 1970-01-01
  • 2016-02-02
相关资源
最近更新 更多