我有一个看起来像这样的配置文件模型:
class Profile(models.Model):
username = models.ForeignKey(User, blank=True, null=True)
age = models.IntegerField(default=0)
points = models.IntegerField(default=100)
def __str__(self):
return str(self.username)
这是我的模板
<h3><a href="{% url 'profile' u=i.user %}" class='username_foreign'>{{ i.user }}</a></h3>
指向此网址:
url(r'^profile/(?P<u>w+)/', profile, name='profile')
这是我的视图函数:
def profile(request, u):
if request.method == 'GET':
profile = Profile.objects.get(username=u)
return render(request, 'base.html', {})
正如你在这里看到的,我通过u
这是用户名。但是当我尝试通过username
get()
profile
时,出现此错误:
ValueError at /profile/zorgan/
invalid literal for int() with base 10: 'zorgan'
但是,当我对Profile
模型的任何其他属性使用 get()
时,它可以正常工作。它甚至打印了我的username
.所以当我这样做时:
def profile(request, u):
if request.method == 'GET':
print(u) #prints username
profile = Profile.objects.get(points=50)
print(profile.username) #successfully prints username (same as 'u')
return render(request, 'base.html', {})
正如您在上面看到的,通过其属性获取Profile
对象不适用于username
。问题与u
无关,因为它也可以成功打印。知道问题是什么吗?
您username
调用的字段根本不是用户名。它是一个外键,它是一个整数值,指向另一个表中的一行。你应该称它为:user
.
若要查找实际用户名,请在 User 表中使用双下划线语法。这将起作用:
profile = Profile.objects.get(username__username=u)
但正如我所说,您确实应该重命名该username
字段,在这种情况下,您将执行以下操作:
profile = Profile.objects.get(user__username=u)
另一种方法是直接查找用户,然后获取配置文件:
user = User.objects.get(username=u)
profile = user.profile
但这需要两个单独的查询,而不是一个联接的查询。