【问题标题】:NoReverseMatch atNoReverseMatch 在
【发布时间】:2020-06-01 17:04:10
【问题描述】:

我在提交表单后尝试redirect 遇到了这个问题:

NoReverseMatch 在 /app_blog/blog/1/blog_update/

没有找到没有参数的“blog_detail”反向。尝试了 1 种模式:['app_blog/blog/(?P[0-9]+)/blog_detail/$']

views.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)

urls.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'),
]

models.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 %}

【问题讨论】:

    标签: django django-forms django-views django-templates


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,但不起作用(顺便说一句,应该是 ...args=...)我现在得到:Reverse for 'blog_detail' with arguments '(&lt;BlogPost: AnotherBlogPost&gt;,)' not found. 1 pattern(s) tried: ['app_blog/blog/(?P&lt;pk&gt;[0-9]+)/blog_detail/$']
    • 对不起,这是我的错误。只需将 pk 作为参数传递。我传递了一个 insted 对象。希望这次能奏效。主要目的是通过args发送博客id
    • 或者你也可以使用 kwargs return HttpResponseRedirect(reverse('app_blog:blog_detail',kwargs={'pk': pk })) 这样做
    • 是的,这就是我一直以来的想法,但是如果不返回上述错误,就无法通过 pk...
    • 根据我上面的回复...不是。
    【解决方案2】:

    使用 django 快捷方式中的 reverse 函数

    【讨论】:

    • 也用过return redirect(reverse(,没用。
    • return reverse(viewname=blog_detail, args=[pk], current_app='app_blog')return reverse(viewname=blog_detail, kwargs={'id':pk}, current_app='app_blog') 告诉我这个:NoReverseMatch at /app_blog/blog/1/blog_update/ Reverse for 'app_blog.views.blog_detail' not found. 'app_blog.views.blog_detail' is not a valid view function or pattern name.
    【解决方案3】:

    好吧,知道了,几天后...

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

    return redirect(... 需要将pk 作为参数,因为redirect 本身需要*args**kwargs,所以完整的行是:

    return redirect('app_blog:blog_detail', pk)
    

    【讨论】:

      猜你喜欢
      • 2017-03-26
      • 2021-03-16
      • 2016-07-20
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2019-04-24
      相关资源
      最近更新 更多