【问题标题】:Reverse for 'user_posts' with keyword arguments '{'username': ''}' not found. 1 pattern(s) tried: ['posts/by/(?P<username>[-\\w]+)/$']?找不到关键字参数“{'username':''}' 的“user_posts”的反向。尝试了 1 种模式:['posts/by/(?P<username>[-\\w]+)/$']?
【发布时间】:2023-03-17 09:28:01
【问题描述】:

我在 django 中不断收到此错误:NoReverseMatc,我不知道为什么。

我的models.py:

from django.conf import settings
from django.core.urlresolvers import reverse
from django.db import models

import misaka

from groups.models import  Group    
from django.contrib.auth import get_user_model
User = get_user_model()

class Post(models.Model):
   user = models.ForeignKey(User, related_name="posts")
   created_at = models.DateTimeField(auto_now=True)
   message = models.TextField()
   message_html = models.TextField(editable=False)
   group = models.ForeignKey(Group, related_name="posts",null=True, blank=True)

   def __str__(self):
       return self.message

   def save(self, *args, **kwargs):
       self.message_html = misaka.html(self.message)
       super().save(*args, **kwargs)

   def get_absolute_url(self):
       return reverse(
           "posts:single",
           kwargs={"username": self.user.username,"pk": self.pk})


   class Meta:
       ordering = ["-created_at"]
       unique_together = ["user", "message"]

我的意见.py:

from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin

from django.core.urlresolvers import reverse_lazy
from django.http import Http404
from django.views import generic

from braces.views import SelectRelatedMixin

from . import forms
from . import models

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

class PostList(SelectRelatedMixin, generic.ListView):
    model = models.Post
    select_related = ("user", "group")


class UserPosts(generic.ListView):
    model = models.Post
    template_name = "posts/user_post_list.html"

    def get_queryset(self):
        try:
            self.post_user = User.objects.prefetch_related("posts").get(
                username__iexact=self.kwargs.get("username")
            )
        except User.DoesNotExist:
            raise Http404
        else:
            return self.post_user.posts.all()

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["post_user"] = self.post_user
        return context


class PostDetail(SelectRelatedMixin, generic.DetailView):
    model = models.Post
    select_related = ("user", "group")

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(
            user__username__iexact=self.kwargs.get("username")
        )


class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):
    # form_class = forms.PostForm
    fields = ('message','group')
    model = models.Post

    # def get_form_kwargs(self):
    #     kwargs = super().get_form_kwargs()
    #     kwargs.update({"user": self.request.user})
    #     return kwargs

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)


class DeletePost(LoginRequiredMixin, SelectRelatedMixin, generic.DeleteView):
    model = models.Post
    select_related = ("user", "group")
    success_url = reverse_lazy("posts:all")

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user_id=self.request.user.id)

    def delete(self, *args, **kwargs):
        messages.success(self.request, "Post Deleted")
        return super().delete(*args, **kwargs)

我的 urls.py 是这样的:

from django.conf.urls import url
from . import views

app_name='posts'

urlpatterns = [
    url(r"^$", views.PostList.as_view(), name="all"),
    url(r"new/$", views.CreatePost.as_view(), name="create"),
    url(r"by/(?P<username>[-\w]+)/$",views.UserPosts.as_view(),name="user_posts"),
    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"),
]

我的 _post.html

<div class="post media">
    <h3>{{ post.message_html|safe }}</h3>
    <div class="media-body">
        <strong>{{ post.user.username }}</strong>
        <h5 class="media-heading">
            <span class="username"><a href="{% url 'posts:for_user' username=post.user.username %}">@{{ post.user.username }}</a></span>
            <time class="time"><a href="{% url 'posts:single' username=post.user.username pk=post.pk %}">{{ post.created_at }}</a></time>
            {% if post.group %}
            <span class="group-name">in <a href="#">{{ post.group.name }}</a></span>
            {% endif %}
        </h5>

        <div class="media-footer">
            {% if user.is_authenticated and post.user == user and not hide_delete %}
                <a href="{% url 'posts:delete' pk=post.pk %}" title="delete" class="btn btn-simple">
                    <span class="glyphicon glyphicon-remove text-danger" aria-hidden="true"></span>
                    <span class="text-danger icon-label">Delete</span>
                </a>
            {% endif %}
        </div>
    </div>
</div>

我的项目中有另一个名为“问题”的应用程序,它几乎使用了这些短语,所以也许这就是问题所在,但我不确定。

【问题讨论】:

  • 请出示urls.py文件
  • 请详细说明“它几乎使用了这些短语”的意思。
  • 看起来这里缺少一些东西,在找到 user_posts 的反向时遇到问题,但我在模板中没有看到对 user_posts 的任何引用(仅 for_user 和 single)。

标签: python django django-templates django-views django-urls


【解决方案1】:

您在模板文件中指定的 url 名称是“for_user”。这与 urls.py 文件 (name='user_posts') 中定义的 url 名称不匹配。这两个名称必须相同,django 才能在 urlpatterns 中建立匹配。此外,您代码中的 url 模式适用于 django 1.11 或更低版本。

但是,如果您使用的是 django 2.0 或更高版本,请使用下面这两个 url 之一;

from django.urls import path, re_path
urlpatterns = [
    re_path(r'^by/(?P<username>\w+)/$', views.UserPosts.as_view(), name='for_user'),
    path('by/<slug:username>/', views.UserPosts.as_view(), name='for_user')
]

【讨论】:

    猜你喜欢
    • 2020-07-02
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多