【问题标题】:Django- NoReverseMatch at /posts/new/in/group-1/Django- NoReverseMatch 在 /posts/new/in/group-1/
【发布时间】:2023-03-31 00:46:02
【问题描述】:

在我的论坛之类的网站上。我想要一个功能,如果用户是组的一部分,那么只有用户可以选择在组中发帖。现在,当单击“POST”按钮时,我试图在 URL 中传递组 slug。但是由于某种原因 URL 不匹配。组和帖子分别有两个不同的应用程序。

  1. 这是“group_detail.html”的 POST 按钮,一旦用户加入群组(第 10 行)即可点击-
{% extends "groups/group_base.html" %}

{% block content %}

<h1>{{group.name}}</h1>
<h2> Member Count: {{group.members.count}}</h2>

  <div class="content">


                {% if user in group.members.all %}
                    <a href="{% url 'groups:leave' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-remove-circle"></span> Leave</a>
    //line 10          <a href="{% url 'posts:create1' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning" ><span class="glyphicon glyphicon-ok-circle"></span>Post</a></li>
                    {% else %}
                    <a href="{% url 'groups:join' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-ok-circle"></span> Join</a>
                {% endif %}

</div>
  1. 这是 Post 应用的 urls.py
from django.conf.urls import url
from django.urls import path
from . import views

app_name='posts'

urlpatterns = [
    url(r"^$", views.PostList.as_view(), name="all"),
    url(r"new/in/(?P<slug>[-\w]+)/$", views.CreatePost.as_view(), name="create1"),
    url(r"by/(?P<username>[-\w]+)/$",views.UserPosts.as_view(),name="for_user"),
    url(r"by/(?P<username>[-\w]+)/(?P<pk>\d+)/$",views.PostDetail.as_view(),name="single"),
    url(r"delete/(?P<pk>\d+)/$",views.DeletePost.as_view(),name="delete"),
]

  1. 这是 Post 应用的 views.py
# from django.shortcuts import render

# # Create your views here.
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin

from django.urls import reverse_lazy
from django.http import Http404
from django.views import generic
from django.shortcuts import get_object_or_404
from groups.models import Group

from braces.views import SelectRelatedMixin

from . import forms
from . import models

from django.contrib.auth import get_user_model
User = get_user_model()

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    # form_class = forms.PostForm
    fields = ('message',)
    model = models.Post
    def get(self, request, *args, **kwargs):
        group = get_object_or_404(Group,slug=self.kwargs.get("slug"))

        # try:
        #     GroupMember.objects.create(user=self.request.user,group=group)

        # except IntegrityError:
        #     messages.warning(self.request,("Warning, already a member of {}".format(group.name)))

        # else:
        #     messages.success(self.request,"You are now a member of the {} group.".format(group.name))

        return super().get(request, *args, **kwargs)


    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.group=group
        self.object.save()
        return super().form_valid(form)
  1. 这是 post_form.html 即表单模板
{% extends "posts/post_base.html" %}

{% load bootstrap3 %}

{% block content %}
<h4>Create New Post</h4>
//line 7 <form method="POST" action="{% url 'posts:create1' slug=group.slug %}" id="postForm">
    {% csrf_token %}
    {% bootstrap_form form %}
    <input type="submit" value="Post" class="btn btn-primary btn-large">
</form>
{% endblock %}

单击发布按钮时出现以下错误- error image

【问题讨论】:

  • 'posts:create1' 这是您尝试反转到的 URL 的名称,但在您输入的内容中没有该 URL。我只看到'create1', 'for_user', 'single', 'delete'
  • 我没听明白,先生,posts:create1 不是指的是帖子应用程序的 url 名为 'create1' 吗?我在 group_detail.html 中指的是它,它位于组应用程序中。
  • 不带posts:试试看是否可行,
  • 它没有用,相反,我什至无法首先访问 group_detail.html。对于使用 slug 作为关键字参数的其他情况,我没有得到这一点,但不是这个。它的语法相同,并且由于 URL 不匹配而无法到达视图。当我没有 group slug 作为关键字参数时它起作用,但在这种情况下,我将无法将组信息发送到视图。

标签: django-urls


【解决方案1】:

错误来自帖子应用程序的“post_form.html”第 7 行,如评论所示。

改成-

<form method="POST" action="{% url 'posts:create1' slug=group.slug %}" id="postForm">

到-

<form method="POST" action="" id="postForm">

我通过在网页上打印它来检查它,即使 url 显示正确的 slug,group.slug 在这种形式中也变为空,因此网页中的 {{ group.slug }} 没有打印任何内容。

这样就解决了上面的错误。

我还更改了 post 应用程序的 views.p 为 createPost 视图,以使我的功能正常工作。 在这个过程中,我到处将“slug”改为“pk”,用它的主键来引用这个组。

所以现在所有上述文件如下所示(创建帖子功能现在可以正常工作了)-

  1. 这是“group_detail.html”的 POST 按钮,一旦用户加入群组(第 10 行)即可点击-
{% extends "groups/group_base.html" %}

{% block content %}

<h1>{{group.name}}</h1>
<h2> Member Count: {{group.members.count}}</h2>

  <div class="content">


                {% if user in group.members.all %}
                    <a href="{% url 'groups:leave' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-remove-circle"></span> Leave</a>
   //line 10        <a href="{% url 'posts:create1' pk=group.pk %}" class="btn btn-lg btn-fill btn-warning" ><span class="glyphicon glyphicon-ok-circle"></span>Post</a></li>
                    {% else %}
                    <a href="{% url 'groups:join' slug=group.slug %}" class="btn btn-lg btn-fill btn-warning"><span class="glyphicon glyphicon-ok-circle"></span> Join</a>
                {% endif %}

</div>
  1. 这是 Post 应用的 urls.py
from django.conf.urls import url
from django.urls import path
from . import views

app_name='posts'

urlpatterns = [
    url(r"^$", views.PostList.as_view(), name="all"),
    url(r"new/in/(?P<pk>\d+)/$", views.CreatePost.as_view(), name="create1"),
    url(r"by/(?P<username>[-\w]+)/$",views.UserPosts.as_view(),name="for_user"),
    url(r"by/(?P<username>[-\w]+)/(?P<pk>\d+)/$",views.PostDetail.as_view(),name="single"),
    url(r"delete/(?P<pk>\d+)/$",views.DeletePost.as_view(),name="delete"),
]

  1. 这是发布应用的views.py-
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin

from django.urls import reverse_lazy
from django.http import Http404
from django.views import generic
from django.shortcuts import get_object_or_404
from groups.models import Group

from braces.views import SelectRelatedMixin

from . import forms
from . import models

from django.contrib.auth import get_user_model
User = get_user_model()

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    fields = ('message',)
    model = models.Post

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.group=get_object_or_404(Group,pk=self.kwargs.get('pk'))
        self.object.save()
        return super().form_valid(form)
  1. 这是发布应用的 post_form.html 即表单模板-
{% extends "posts/post_base.html" %}

{% load bootstrap3 %}

{% block content %}
<h4>Create New Post</h4>
//line 7  <form method="POST" action="" id="postForm">
    {% csrf_token %}
    {% bootstrap_form form %}
    <input type="submit" value="Post" class="btn btn-primary btn-large">
</form>
{% endblock %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多