【发布时间】: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。代码很长,所以我决定不发布所有内容。