我的Django URL模式命名有问题

问题描述 投票:0回答:1

出于任何原因,当我给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
python django django-models django-urls url-pattern
1个回答
0
投票

我建议您阅读Django文档的[名称空间]部分,here

问题是由于您拥有app_name = 'webapp',但没有与postdetail一起使用

app_name的目的是,如果您在具有相同名称的不同应用程序中有两个网址,请确保您知道重定向到的位置。

更改

return reverse("postdetail", kwargs={'pk': self.pk})

return reverse("webapp:postdetail", kwargs={'pk': self.pk})
© www.soinside.com 2019 - 2024. All rights reserved.