Python 如何解决Django中没有反向匹配的问题
我有这个错误,当我试图发布一个新的职位,它没有给我之前的错误,直到我添加了文件上传功能,以创建职位页面,现在当我试图创建后上传文件在获取这个错误 NoReverseMatch at/post/new/ 未找到“发布详细信息”的反向项“发布详细信息”不是有效的视图函数或模式名称。 下面是我的views.py代码Python 如何解决Django中没有反向匹配的问题,python,django,Python,Django,我有这个错误,当我试图发布一个新的职位,它没有给我之前的错误,直到我添加了文件上传功能,以创建职位页面,现在当我试图创建后上传文件在获取这个错误 NoReverseMatch at/post/new/ 未找到“发布详细信息”的反向项“发布详细信息”不是有效的视图函数或模式名称。 下面是我的views.py代码 from django.contrib import messages from django.contrib.auth.mixins import (LoginRequiredMixin
from django.contrib import messages
from django.contrib.auth.mixins import (LoginRequiredMixin, UserPassesTestMixin)
from django.contrib.auth.models import User
from django.urls import reverse_lazy, reverse
from django.http import HttpResponseRedirect, Http404
from django.shortcuts import render, get_object_or_404
from django.views.generic import (ListView, DetailView, CreateView,
UpdateView, DeleteView)
from .models import Post, Comment
from django.core.files.storage import FileSystemStorage
from .forms import CommentForm
from . import models
def home(request):
context = {
'posts': Post.objects.all()
}
return render(request, 'blog/home.html', context)
def upload(request):
if request.method == 'POST':
uploaded_file = request.FILES['document']
fs = FileSystemStorage()
fs.save(uploaded_file.name, uploaded_file)
return render(request, 'blog/post_form.html')
class PostListView(ListView):
model = Post
template_name = 'blog/home.html'
context_object_name = 'posts'
ordering = ['-date_posted']
paginate_by = 6
class UserPostListView(ListView):
model = Post
template_name = 'blog/user_posts.html'
context_object_name = 'posts'
paginate_by = 6
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(author=user).order_by('-date_posted')
class PostDetailView(DetailView):
model = Post
def post_comment(request, id, slug):
post = get_object_or_404(Post, id=id, slug=slug)
comments = Comment.objects.filter(post=post).order_by('-id')
if request.method == 'POST':
comment_form = CommentForm(request.POST or None)
if comment_form.is_valid():
content = request.POST.get('content')
comment = Comment.objects.create(post=post, user=request.user, content=content)
comment.save()
return HttpResponseRedirect(post.get_absolute_url())
else:
comment_form = CommentForm()
context = {'comments': comments,
'comment_form': comment_form}
return render(request, 'blog/post_comment.html', context)
class PostCreateView(LoginRequiredMixin, CreateView):
model = models.Post
fields = ['title', 'content', 'group', 'file']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
model = Post
fields = ['title', 'content']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
model = Post
success_url = reverse_lazy('posts:blog-home')
def test_func(self):
post = self.get_object()
if self.request.user == post.author:
return True
return False
def about(request):
return render(request, 'blog/about.html', {'title': 'About'})
这是我的应用程序URL.py代码
from django.urls import path
from .views import (PostListView, PostCreateView,
PostUpdateView, PostDetailView, PostDeleteView, UserPostListView)
from . import views
app_name = 'posts'
urlpatterns = [
path('', PostListView.as_view(), name="blog-home"),
path('user/<str:username>', UserPostListView.as_view(), name="user-posts"),
path('post/<int:pk>/', PostDetailView.as_view(), name="post-detail"),
path("post/<int:pk>/", views.post_comment, name="comments"),
path('post/new/', PostCreateView.as_view(), name="post-create"),
path('post/<int:pk>/update', PostUpdateView.as_view(), name="post-update"),
path('post/<int:pk>/delete', PostDeleteView.as_view(), name="post-delete"),
path('about/', views.about, name="blog-about"),
]
从django.url导入路径
从.views导入(PostListView、PostCreateView、,
PostUpdateView、PostDetailView、PostDeleteView、UserPostListView)
从…起导入视图
应用程序名称='posts'
URL模式=[
路径(“”,PostListView.as_view(),name=“blog home”),
路径('user/',UserPostListView.as_view(),name=“user posts”),
路径('post/',PostDetailView.as_view(),name=“post detail”),
路径(“post/”,views.post_comment,name=“comments”),
路径('post/new/',PostCreateView.as_view(),name=“post create”),
路径('post//update',PostUpdateView.as_view(),name=“post update”),
路径('post//delete',PostDeleteView.as_view(),name=“post delete”),
路径('about/',views.about,name=“blog about”),
]
这是我的项目URL.py代码
from django.contrib import admin
from django.contrib.auth import views as auth_views
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from users import views as user_view
urlpatterns = [
path('admin/', admin.site.urls),
path('register/', user_view.register, name="register"),
path('profile/', user_view.profile, name="profile"),
path('groups/',include("groups.urls", namespace="groups")),
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name="login"),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name="logout"),
path('password-reset/', auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'), name="password_reset"),
path('password-reset/done/', auth_views.PasswordResetDoneView.as_view(template_name='users/password_reset_done.html'), name="password_reset_done"),
path('password-reset-confirm/<uidb64>/<token>/', auth_views.PasswordResetConfirmView.as_view(template_name='users/password_reset_confirm.html'), name="password_reset_confirm"),
path('password-reset-complete/', auth_views.PasswordResetCompleteView.as_view(template_name='users/password_reset_complete.html'), name="password_reset_complete"),
path('', include("blog.urls")),
]
if settings.DEBUG:
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
来自django.contrib导入管理
从django.contrib.auth导入视图作为auth_视图
从django.url导入路径,包括
从django.conf导入设置
从django.conf.url.static导入静态
从用户导入视图作为用户视图
URL模式=[
路径('admin/',admin.site.url),
路径('register/',user_view.register,name=“register”),
路径('profile/',user_view.profile,name=“profile”),
路径('groups/',include('groups.url',namespace=“groups”),
路径('login/',auth_views.LoginView.as_view(template_name='users/login.html'),name=“login”),
path('logout/',auth_views.LogoutView.as_view(template_name='users/logout.html'),name=“logout”),
路径('password-reset/',auth_views.PasswordResetView.as_view(template_name='users/password_reset.html'),name=“password_reset”),
路径('password-reset/done/',auth_views.PasswordResetDoneView.as_view(template\u name='users/password\u reset\u done.html'),name=“password\u reset\u done”),
路径('password-reset-confirm//',auth_views.PasswordResetConfirmView.as_view(template\u name='users/password\u reset\u confirm.html'),name=“password\u reset\u confirm”),
路径('password-reset-complete/',auth_views.PasswordResetCompleteView.as_view(template\u name='users/password\u reset\u complete.html'),name=“password\u reset\u complete”),
路径(“”,包括(“blog.url”),
]
如果设置为.DEBUG:
urlpatterns+=静态(settings.static\u URL,document\u root=settings.static\u root)
urlpatterns+=静态(settings.MEDIA\u URL,document\u root=settings.MEDIA\u root)
这是我的模板post_detail.html代码
{% extends "blog/base.html" %}
{% block content %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{ object.author.profile.image.url }}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2" href="{% url 'posts:user-posts' object.author.username %}">{{ object.author }}</a>
<small class="text-muted">{{ object.date_posted|date:"F d, Y" }}</small>
{% if object.author == user %}
<div>
<a class="btn btn-secondary btn-sm mt-1 mb-1" href="{% url 'posts:post-update' object.id %}">Update</a>
<a class="btn btn-danger btn-sm mt-1 mb-1" href="{% url 'posts:post-delete' object.id %}">Delete</a>
</div>
{% endif %}
</div>
<h2 class="article-title">{{ object.title }}</h2>
<p class="article-content">{{ object.content }}</p>
</div>
</article>
{% endblock %}
{%extends“blog/base.html”%}
{%block content%}
{{object.date{u posted}日期:“fd,Y”}
{%if object.author==user%}
{%endif%}
{{object.title}}
{{{object.content}
{%endblock%}
该应用程序的工作方式是,当你发布的帖子出现在由用户_posts.html控制的主页上时,代码如下
{% extends "blog/base.html" %}
{% block content %}
<h2 class="mb-3">Posts by {{ views.kwargs.username }} ({{ page_obj.paginator.count }})</h2>
{% for post in posts %}
<article class="media content-section">
<img class="rounded-circle article-img" src="{{ post.author.profile.image.url }}">
<div class="media-body">
<div class="article-metadata">
<a class="mr-2" href="{% url 'posts:user-posts' post.author.username %}">{{ post.author }}</a>
<small class="text-muted">{{ post.date_posted|date:"F d, Y" }}</small>
</div>
<h2><a class="article-title" href="{% url 'posts:post-detail' post.id %}">{{ post.title }}</a></h2>
<p class="article-content">{{ post.content }}</p>
</div>
</article>
{% endfor %}
{% if is_paginated %}
{% if page_obj.has_previous %}
<a class="btn btn-outline-info mb-4" href="?page=1">First</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}
{% for num in page_obj.paginator.page_range %}
{% if page_obj.number == num %}
<a class="btn btn-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<a class="btn btn-outline-info mb-4" href="?page={{ num }}">{{ num }}</a>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next</a>
<a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>
{% endif %}
{% endif %}
{% endblock %}
{%extends“blog/base.html”%}
{%block content%}
按{views.kwargs.username}}({{page_obj.paginator.count}})发布的帖子
{posts%%中的post为%s}
{{发布日期{发布日期:“F d,Y”}
{{post.content}
{%endfor%}
{%if已分页%}
{%如果页面_obj.has_previous%}
{%endif%}
{page_obj.paginator.page_range%}
{%if page_obj.number==num%}
{%elif num>page_obj.number | add:'-3'和num
这是回溯期间显示为粗体的错误
C:\Users\HOPE\Desktop\Django\Blog\u project\Blog\views.py格式为\u valid
返回super().form\u有效(form)
获取绝对url中的C:\Users\HOPE\Desktop\Django\Blog\u project\Blog\models.py
返回反向('post-detail',kwargs={'pk':self.pk})问题出在这一行的“user_posts.html”中
<h2><a class="article-title" href="{% url 'posts:post-detail' post.id %}">{{ post.title }}</a></h2>
这一行应该包括:
<h2><a class="article-title" href="{% url 'posts:post-detail' pk=post.id %}">{{ post.title }}</a></h2>
如果我们看一下你的“url.py”-
path('post/<int:pk>/', PostDetailView.as_view(), name="post-detail"),
路径('post/',PostDetailView.as_view(),name=“post detail”),
我们看到您访问此url的方式是使用整数pk。
因此,在html文件中,当尝试反转到此url时,请确保指定pk=post.id。这样,django就知道要将哪些信息传递到url。请只发布相关代码