タイトルにあるように、request.userとrequest.user.usernameの違いは何ですか?私はそれらをいくつかの変数と比較するためにそれらを使用します、そして時々それは最初のものを使用してそして時々2番目を使用して動作します
2 に答える
request.user
はUser
インスタンスでrequest.user.username
あり、はそのユーザーの文字列ですusername
。
たとえば'admin'
、文字列がある場合は、それを。と比較する必要がありrequest.user.username
ます。
質問は、テンプレートでユーザーオブジェクトを使用していて、テンプレートが同じよう{{user}}
に{{user.username}}
レンダリングされることを理解した後にのみ発生すると思います。
重要なのは、テンプレートをレンダリングすると、djangoは変数をそのユニコード表現(文字列)に自動的に変換し、ビュー関数では文字列ではなくモデルのインスタンスにすることができるということです。
app django.contrib.authのユーザークラスには、次のようなUnicode表現があります
def __unicode__(self):
return self.username
そして多分それはあなたが混乱していた理由ですuser
そしてuser.username
。
この誤解は危険な場合があります。
if user1 == user2.username:
取得できませんTypeError
。modelsからdjangoモデルが組み込まれます。Modelには演算子があります。
def __eq__(self, other):
return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
これは、user1とuser2.usernameが同じクラスを持っているかどうかを検出します。
とにかく、少し練習すると、文字列とモデルのオブジェクトの違いがわかると思います。