【发布时间】:2022-01-25 19:42:39
【问题描述】:
我曾尝试查看类似的问题,但似乎无法解决此错误。
/groups/ 处的 NoReverseMatch
使用关键字参数'{'username': ''}' 反向查找'for_user'。尝试了 1 种模式:['posts/by/(?P[-\w]+)/$']
models.py
from groups.models import Group
# Create your models here.
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=models.CASCADE)
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,on_delete=models.CASCADE)
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']
Views.py
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):
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 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)
##POSTS URLS
from django.urls import re_path
from . import views
app_name = 'posts'
urlpatterns = [
re_path(r'^$',views.PostList.as_view(),name='all'),
re_path(r'newpost/$',views.CreatePost.as_view(),name='create'),enter code here
re_path(r"by/(?P<username>[-\w]+)/$",views.UserPosts.as_view(),
name="for_user"),
re_path(r"by/(?P<username>[-\w]+)/(?P<pk>\d+)/$",views.PostDetail.as_view(),
name="single"),
re_path(r'delete/(?P<pk>\d+)/$',views.DeletePost.as_view(),name='delete'),
]
【问题讨论】:
-
在代码中的某个地方,您反转到名为“posts:for_user”的路径,并提供一个空的用户名作为参数。您执行此操作的代码不在粘贴的代码中。您在 Class Post 的 get_absolute_url 中做了类似的事情,但反向名称是“posts:single”
-
在您的 urlspattern 的第二行中留下了一些文本“在此处输入代码”,这可能来自复制粘贴错误。只是作为一个提示