出于任何原因,当我给name =“ ...”时-URL模式的参数,我想通过使用它的名称来引用它似乎无效。那是我的“ webapp / urls.py”文件:
from django.urls import path
from .views import PostListView, PostDetailView, PostCreateView
from .import views
app_name = 'webapp'
urlpatterns = [
path("", PostListView.as_view(), name="webapphome"),
path("post/<int:pk>/", PostDetailView.as_view(), name="postdetail"),
path('post/new/', PostCreateView.as_view(), name="postcreate"),
path("about/", views.About, name="webappabout"),
]
这是我的'webapp / views.py'文件:
from django.shortcuts import render
from django.views import generic
from django.views.generic import ListView, DetailView, CreateView
from .models import Post
def Home(request):
context = {
'posts': Post.objects.all() }
return render(request, "webapp/home.html", context)
class PostListView(ListView):
model = Post
template_name = 'webapp/home.html'
context_object_name = 'posts'
ordering = ['-date']
class PostDetailView(DetailView):
model = Post
template_name = 'webapp/detail.html'
class PostCreateView(CreateView):
model = Post
fields = ['title', 'content']
template_name = 'webapp/postform.html'
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def About(request):
return render(request, "webapp/about.html", {'title': 'About'})
这是我的'webapp / models.py'文件:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
from django.urls import reverse
class Post(models.Model):
title = models.CharField(max_length=50)
content = models.TextField(max_length=300)
date = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("postdetail", kwargs={'pk': self.pk})
您可以看到,我使用的是PostDetailView的URL路径的名称'postdetail',但是在创建新的Post时却收到这样的错误:
NoReverseMatch at /post/new/
Reverse for 'postdetail' not found. 'postdetail' is not a valid view function or pattern name.
Request Method: POST
Exception Type: NoReverseMatch
我建议您阅读Django文档的[名称空间]部分,here
问题是由于您拥有app_name = 'webapp'
,但没有与postdetail
一起使用
app_name的目的是,如果您在具有相同名称的不同应用程序中有两个网址,请确保您知道重定向到的位置。
更改
return reverse("postdetail", kwargs={'pk': self.pk})
到
return reverse("webapp:postdetail", kwargs={'pk': self.pk})