django - NoReverseMatch 在
问题描述
redirect
提交表单后,我遇到了这个问题:
/app_blog/blog/1/blog_update/ 处的 NoReverseMatch
未找到任何参数的“blog_detail”反向。尝试了 1 种模式:['app_blog/blog/(?P[0-9]+)/blog_detail/$']
视图.py:
from django.shortcuts import render, redirect
# from django.urls import reverse
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import Group
from django.contrib import messages
from app_users.decorators import unauthenticated_user, allowed_users
from .models import BlogPost
from .forms import BlogUpdateForm
@login_required(login_url='app_users:login')
@allowed_users(allowed_roles=['admin', 'staff', 'users'])
def blog(request):
posts = BlogPost.objects.all()
context = {'title': 'Blog', 'posts': posts}
return render(request, 'app_blog/blog.html', context)
def blog_detail(request, pk):
user_post = BlogPost.objects.get(id=pk)
context = {'title': 'Blog', 'user_post': user_post}
return render(request, 'app_blog/blog_detail.html', context)
def blog_user_detail(request, pk):
user_detail = BlogPost.objects.get(id=pk)
user_type = user_detail.author.groups.all()[0].name.capitalize()
context = {'title': 'Blog', 'user_detail': user_detail, 'user_type': user_type}
return render(request, 'app_blog/blog_user_detail.html', context)
def blog_update(request, pk):
if request.method == 'POST':
blog_update = BlogUpdateForm(request.POST, instance=BlogPost.objects.get(id=pk))
if blog_update.is_valid():
blog_update.save()
messages.success(request, 'Your blog-post has been updated!')
return redirect('app_blog:blog_detail')
else:
blog_update = BlogUpdateForm(instance=BlogPost.objects.get(id=pk))
context = {'title': 'Blog', 'blog_update': blog_update}
return render(request, 'app_blog/blog_update.html', context)
网址.py:
from django.urls import path
from .views import *
app_name = 'app_blog'
urlpatterns = [
path('blog/', blog, name='blog'),
path('blog/<int:pk>/blog_detail/', blog_detail, name='blog_detail'),
path('blog/<int:pk>/user_details/', blog_user_detail, name='blog_user_detail'),
path('blog/<int:pk>/blog_update/', blog_update, name='blog_update'),
]
模型.py:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class BlogPost(models.Model):
title = models.CharField(max_length=100, null=True)
content = models.TextField(null=True)
date_posted = models.DateTimeField(default=timezone.now, null=True, blank=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
blog_detail.html:
{% extends 'app_t35/main.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<br>
<div class="container">
<article class="media content-section">
<img class="rounded-circle article-image" src="{{ user_post.author.profile.image.url }}" alt="Image Missing!">
<div class="card-body media-body">
<div class="article-metadata">
<a class="mr-2" href="{% url 'app_blog:blog_user_detail' user_post.id %}">{{ user_post.author }}</a>
<small class="text-muted">{{ user_post.date_posted|date:"d F, Y" }}</small>
{% if user_post.author == request.user %}
<div>
<a class="btn btn-primary btn-sm mt-1 mb-1" href="{% url 'app_blog:blog_update' user_post.id %}">Update</a>
<a class="btn btn-primary btn-danger btn-sm mt-1 mb-1" href="">Delete</a>
</div>
{% endif %}
</div>
<h2 class="article-title">{{ user_post.title }}</h2>
<p class="article-content">{{ user_post.content|safe }}</p>
</div>
</article>
</div>
<br>
{% endblock %}
blog_update.html:
{% extends 'app_t35/main.html' %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<br>
<div class="card card-body container">
<div class="card-deck">
<img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
<h5 style="text-align: left;">{{ user.username }}:</h5>
<div class="card card-body">
<form action="" method="POST">
{% csrf_token %}
<fieldset class="form-group">
<legend class="border-bottom mb-4">If you wish to update your blog-post:</legend>
{{ blog_update|crispy }}
</fieldset>
<div class="form-group">
<button class="btn btn-outline-info btn-sm btn-block" style="width: 150px; align-self: center;" type="submit">Update Details</button>
</div>
</form>
</div>
</div>
</div>
<br>
{% endblock %}
解决方案
在博客更新视图中 - 您没有在重定向中传递博客文章的 ID。使用 HttpResponseRedirect 并传递要重定向的博客的 ID。
return HttpResponseRedirect(reverse('app_blog:blog_detail',args=[pk]))
推荐阅读
- laravel - Laravel 8,为公共文件夹中的所有图像创建 zip 文件。面对文件错误:ZipArchive::addFile(): Invalid or uninitialized Zip object
- laravel - 不应静态调用非静态方法 Gloudemans\Shoppingcart\Cart::add()
- android - 当 hardwareAccelerated 为 false 时,cardview 不起作用
- laravel - 如何通过 (start <= date1 and end >= date1) || (start <= date2 and end >= date2) laravel 中的条件
- android - arcgis-android-100.3.0.pom 表示禁止
- arrays - 来自随机排序数组的 C 第一和第三四分位数
- java - Java:从索引到结尾的子字符串
- mongodb - 根据对象数组中的属性过滤掉 MongoDB 文档
- google-sheets - 获取两个日期之间的差异
- wordpress - Wordpress:只有子类别可点击帖子编辑器