【问题标题】:No user matches given query even though the user exists即使用户存在,也没有用户匹配给定的查询
【发布时间】:2025-12-31 23:25:01
【问题描述】:

我是 Django 的新手,正在努力通过在 url 中使用用户的用户名来访问用户个人资料页面,例如mysite.com/profile/someusername

我将在几个地方提供指向个人资料的链接,但我首先尝试的是在导航栏中访问已登录用户的页面。

base.html

<a class="dropdown-item" href="{% url 'fillups:user_profile' username=user.username %}" class="btn btn-simple">Overview</a>

这会正确显示当前登录的用户名,在本例中,我们将使用用户名 seconduser

这是我为此使用的 url 模式:

path('profile/<str:username>/',views.UserProfile.as_view(),name='user_profile')

到目前为止,导航栏将显示用户名 seconduser,当我单击按钮时,我被带到 url /profile/seconduser/,这正是我想要的。

问题是,我现在无法使用视图中的用户名来查询给定用户的对象。到目前为止,这是我对这个观点的看法

views.py

class UserProfile(TemplateView):
    template_name = 'fillups/user_profile.html'
    slug_field = "username"
    slug_url_kwarg = "username"

    def get_context_data(self, **kwargs):
        context = super(UserProfile, self).get_context_data(**kwargs)
        usr = get_object_or_404(User, username=self.kwargs.get("username"))
        overview_stats = {
            'total_cars': Car.objects.filter(username=usr).count(),
            'total_fillups': Fillup.objects.filter(username=self.request.user).count(),
            'total_distance': Fillup.objects.filter(username=self.request.user).aggregate(Sum('trip_distance')),
            'total_gallons': Fillup.objects.filter(username=self.request.user).aggregate(total_gallons = Round(Sum('gallons'),4)),
            'avg_price': Fillup.objects.filter(username=self.request.user).aggregate(avg_price = Round(Avg('price_per_gallon'),3)),
            'total_spent': sum_total_sale(Fillup.objects.filter(username=self.request.user)),
            'avg_mpg': avg_mpg(Fillup.objects.filter(username=self.request.user))
        }
        context['stats'] = overview_stats
        context['active_cars'] = Car.objects.filter(status='Active').filter(username=self.request.user)
        context['last_10_fillups'] = Fillup.objects.filter(username=self.request.user).order_by('-date')[:10]
        return context

现在,overview_stats 字典中的所有内容都是我最初为登录用户查询内容时所拥有的,其中只有一个简单的“myprofile”网址。我遇到的问题是 get_object_or_404 没有找到用户。我知道 username=self.kwargs.get("username") 正在像它应该的那样获得 'seconduser',但由于某种原因我无法获得用户。

有关一些额外信息,这是我的模型之一:

class Car(models.Model):
    username = models.ForeignKey(User,on_delete=models.CASCADE)
    name = models.CharField(max_length=25)
    make = models.CharField(max_length=25)
    model = models.CharField(max_length=25)
    model_year = models.IntegerField(choices=MODEL_YEARS)
    status = models.CharField(max_length=10,choices=STATUS,default='Active')

    def __str__(self):
        return self.name

在我最初做的 Django 教程中,讲师说最好扩展用户模型,这样更容易进行更改,所以我将它放在单独的应用程序 accounts/models.py 中

class User(auth.models.User,auth.models.PermissionsMixin):

    def __str__(self):
        return "@{}".format(self.username)

我已经尝试使用 this question 中的方法,这就是为什么我目前在我的视图中有 slug 字段的东西,而我的问题本质上是 this question 的重复

我整晚都被困在这上面,非常感谢任何帮助,谢谢!

【问题讨论】:

  • 只是为了完全清楚。您是否尝试通过get_object_or_404() in get_context_data() 查找当前用户或“第二个用户”?
  • “第二用户”!我把 self.request.user 的东西留在了那里,因为那是我以前在视图中的东西。一旦我能够弄清楚这一点,我将更新所有这些查询以按在 get_object_or_404() 中找到的用户进行过滤

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


【解决方案1】:

self.kwargs.get("username") 中删除self。应该是kwargs.get("username")

kwargs 是不在对象属性上的参数。

【讨论】:

    最近更新 更多