嘿伙计们,我在Django有点新鲜。我想要实现的是一个URL,我可以通过我的应用程序的GET请求访问该URL,并传递一些值。
我在Django中有一个UserProfile
模型,它与User
有一个OneToOneField关系。我想通过我的GET请求传递电子邮件并使用此电子邮件找到Userinstance,然后我想传递另外两个我想与此用户UserProfile
属性进行比较的值。
但我不太满意了解如何实现这一目标。这就是我所拥有的:
在我的views.py
中def check(request):
try:
email = request.GET.get('email', '')
osusername = request.GET.get('osusername', '')
computername = request.GET.get('computername','')
except TypeError:
return HttpResponseBadRequest()
user = get_object_or_404(User.objects.filter(user__email=email)[0])
在我的urls.py
中urlpatterns = patterns('',
url(r'^check/$', 'myapp.views.check'),)
但是如何比较该用户的User.UserProfile.computername的实例计算机名?无论我怎么写错了。
我的UserProfile模型按要求@comments:
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name='profile')
computername = models.CharField("Computername", max_length=150, blank=False)
osusername = models.CharField("Osusername", max_length=150, blank=False)
答案 0 :(得分:1)
因此get_object_or_404
的语法错误。你没有传递一个对象:它为你获取对象。所以:
user = get_object_or_404(User, email=email)
现在您已经拥有了一个用户实例,并希望获得相关的个人资料,所以您可以这样做:
profile = user.userprofile
或者,如果您不需要其他任何实际用户实例,则可能更容易直接获取配置文件:
profile = get_object_or_404(UserProfile, user__email=email)
现在您可以检查相关属性:
osusername == profile.osusername
computername == profile.computername
答案 1 :(得分:1)
您需要首先通过以下方式检索用户实例:
try:
a_user = User.objects.get(email=email)
except User.DoesNotExist:
# error handling if the user does not exist
然后,通过以下方式获取相应的UserProfile对象:
profile = a_user.userprofile
然后,您可以从UserProfile对象获取osusername和computername:
profile.osusername
profile.computername
答案 2 :(得分:0)
作为@daniel-roseman answer的补充。
如果检查相关属性是多个视图的常见任务,那么在UserProfile模型中创建一个可以执行所需验证检查的方法也是值得的。
class UserProfile(object):
# various attributes ...
def check_machine_attributes(self, os_username, computer_name):
if os_username == self.osusername and computername == self.computername:
return True
return False
在您看来,您可以这样做:
if profile.check_machine_attributes(osusername, computername):
# ...
else:
# ...