首页 > 解决方案 > 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 %}

标签: djangodjango-formsdjango-viewsdjango-templates

解决方案


在博客更新视图中 - 您没有在重定向中传递博客文章的 ID。使用 HttpResponseRedirect 并传递要重定向的博客的 ID。

return HttpResponseRedirect(reverse('app_blog:blog_detail',args=[pk]))

推荐阅读