【发布时间】: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()inget_context_data()查找当前用户或“第二个用户”? -
“第二用户”!我把 self.request.user 的东西留在了那里,因为那是我以前在视图中的东西。一旦我能够弄清楚这一点,我将更新所有这些查询以按在 get_object_or_404() 中找到的用户进行过滤
标签: django django-views django-templates django-urls