如何在Django中显示用户的所有属性

1 投票
2 回答
2502 浏览
提问于 2025-04-16 08:46

这是我的代码:

def callback(req):
 token = req.session.get('token', None)
 if not token:
  return render_to_response('callback.html', {
   'token': True
  })
 token = oauth.OAuthToken.from_string(token)
 if token.key != req.GET.get('oauth_token', 'no-token'):
  return render_to_response('callback.html', {
   'mismatch': True
  })
 token = get_authorized_token(token)

 # Actually login
 obj = is_authorized(token)
 if obj is None:
  return render_to_response('callback.html', {
   'username': True
  })
 try: user = User.objects.get(username=obj['screen_name'])
 except: user = User(username=obj['screen_name'])

 user.oauth_token = token.key
 user.oauth_token_secret = token.secret
 user.save()
 req.session['user_id'] = user.id
 del req.session['token']

 s = ''.join('%s: %s </br>' % (a, getattr(user, a)) for a in dir(user))
 return HttpResponse(s)

我想用

s = ''.join('%s: %s </br>' % (a, getattr(user, a)) for a in dir(user))
return HttpResponse(s)

来显示用户的属性,

但是我遇到了一个错误:

AttributeError at /twitter/login/callback/

Manager isn't accessible via User instances

那我该怎么办呢,

谢谢!

2 个回答

0

一种更简洁的方法是给你的模型添加一个自省的方法。

可以参考 Django 模板:遍历并打印对象的所有可用属性?

还有 在模板中遍历模型实例的字段名称和值

1

你应该通过使用一个循环来排查问题,找出到底哪里出错了!

我遍历了 User 对象,发现它对 getattr(user, '_base_manager')getattr(user, 'objects') 这两个东西不太满意。

你是想要字段,还是想要和用户对象相关的所有 Python 代码呢?

如果你只想要在 models.py 中定义的字段:

for field in user._Meta.fields:
    print '%s: %s' % (field.name, field.value_to_string(user))

如果你想要 dir 函数的所有神奇效果
那就用普通的循环吧。列表推导式并不会更容易捕捉到异常。

for attr in dir(user):
    try:
        print '%s: %s' % (attr, getattr(user, attr))
    except Exception, e:
        print '%s: %s' % (attr, e)

如果你真的很喜欢使用列表推导式

def no_exception_getattr(user, attr):
    try: 
        return getattr(user, attr)
    except Exception, e: 
        return e

''.join(['%s: %s' % (x, no_exception_getattr(user, x)) for x in dir(user)])

撰写回答