Django 2.2 NoreVerseMatch错误,Kwargs返回空白字符串



我在夸尔格(Kwargs(的空白字符串中获得了一个noreversematch错误。我在模型中做错了什么。Py文件,该文件不保存与帖子关联的用户名?

noreversematch at/groups/posts/in/in/nasa-rocks/for'for_user' 使用关键字参数'{'username':'''}'找不到。1个模式 尝试:['post/by/(?p [^/] (/$']

models.py:

from django.db import models
from django.urls import reverse
from django.conf import settings
# Create your models here.
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',on_delete='CASCADE')
    group = models.ForeignKey(Group,related_name='posts',null=True,blank=True,on_delete='CASCADE')
    created_at = models.DateTimeField(auto_now=True)
    message = models.TextField()
    message_html = models.TextField(editable=False)
    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:detail',kwargs={'username':self.user.username,'pk':self.pk})
    class Meta:
        ordering = ['-created_at']
        unique_together = ['user','message']

urls.py:

from django.urls import path
from . import views
app_name = 'posts'
urlpatterns = [
    path('',views.PostListView.as_view(),name='list'),
    path('create/',views.PostCreateView.as_view(),name='create'),
    path('by/<username>/',views.UserPosts.as_view(),name='for_user'),
    path('by/<username>/<pk>/',views.PostDetailView.as_view(),name='detail'),
    path('delete/<pk>/',views.PostDeleteView.as_view(),name='delete')
]

views.py:

from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views import generic
from django.http import Http404
from braces.views import SelectRelatedMixin
from . import models
from . import forms
from django.contrib.auth import get_user_model
User = get_user_model()
# Create your views here.
class PostListView(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 PostDetailView(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 PostCreateView(LoginRequiredMixin,SelectRelatedMixin,generic.CreateView):
    fields = ('message','group')
    model = models.Post
    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 PostDeleteView(LoginRequiredMixin,SelectRelatedMixin,generic.DeleteView):
    model = models.Post
    select_related = ('user','group')
    success_url = reverse_lazy('posts:list')
    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(user_id=self.request.user.id)
        def delete(self,*args,**kwargs):
            message.success(self.request,'Post Deleted')
            return super().delete(*args,**kwargs)

_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:detail' 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 %}
        <a href="{% url 'posts:delete' pk=post.pk %}" title='delete' class="btn btn-simple">
          <span class="fas fa-trash-alt text-danger" aria-hidden="True"></span>
          <span class="text-danger icon-label">Delete</span>
        </a>
      {% endif %}
    </div>
  </div>
</div>

据我了解,问题是空的用户名。默认模式要求它至少为一个符号['posts/by/(?P[^/]+)/$']。因此,您可能没有正确获取模型或没有用户来发布。

错误顺便说一句。它显示了模式和参数,您需要更加谨慎。

最新更新