我是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
这是我为此使用的网址格式:
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 dict中的所有内容都是我只为登录用户查询内容时的原始内容,那里只有一个简单的“ myprofile” URL。我遇到的问题是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教程中,讲师说最好扩展用户模型,以便更轻松地进行更改,因此我将其放在单独的应用程序account / models.py
中class User(auth.models.User,auth.models.PermissionsMixin):
def __str__(self):
return "@{}".format(self.username)
我尝试使用this question中的方法,这就是为什么我目前在视图中使用子弹字段的原因,而我的问题本质上是this question的重复
我整夜都被困住了,非常感谢您的帮助,谢谢!
答案 0 :(得分:0)
从self
中删除self.kwargs.get("username")
。应该是kwargs.get("username")
。
kwargs
是不属于对象属性的参数。