У меня проблема с именами шаблонов URL Django - PullRequest
0 голосов
/ 13 апреля 2020

По любой причине, когда я даю аргумент 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 'file:

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})

Как вы можете видеть, я использую имя' postdetail ', которое я дал URL-адресу из PostDetailView, но, тем не менее, я получаю ошибку, подобную этой, когда создаю новое сообщение :

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

1 Ответ

1 голос
/ 13 апреля 2020

Я бы посоветовал вам прочитать раздел Пространство имен в Django Документация, здесь

Проблема в том, что у вас есть app_name = 'webapp', но вы не используете его с postdetail

Цель app_name - убедиться, что вы знаете, куда перенаправить, если у вас есть два URL в разных приложениях с одинаковыми именами.

изменить

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

на

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