Djangoで、現在ログインしているユーザーを知るにはどうすればよいですか?


回答:


110

どこでユーザーを知る必要がありますか?

ビューユーザは、AS要求に設けられていますrequest.user

テンプレートでのユーザー処理については、こちらをご覧ください

モデルのインスタンスの作成者または編集者を保存する場合は、次のようにすることができます。

model.py

class Article(models.Model):
    created_by = models.ForeignKey(User, related_name='created_by')
    created_on = models.DateTimeField(auto_now_add = True)
    edited_by  = models.ForeignKey(User, related_name='edited_by')
    edited_on  = models.DateTimeField(auto_now = True)
    published  = models.BooleanField(default=None)

admin.py

class ArticleAdmin(admin.ModelAdmin):
    fields= ('title','slug','text','category','published')
    inlines = [ImagesInline]
    def save_model(self, request, obj, form, change): 
        instance = form.save(commit=False)
        if not hasattr(instance,'created_by'):
            instance.created_by = request.user
        instance.edited_by = request.user
        instance.save()
        form.save_m2m()
        return instance

    def save_formset(self, request, form, formset, change): 

        def set_user(instance):
            if not instance.created_by:
                instance.created_by = request.user
            instance.edited_by = request.user
            instance.save()

        if formset.model == Article:
            instances = formset.save(commit=False)
            map(set_user, instances)
            formset.save_m2m()
            return instances
        else:
            return formset.save()

これはインターネットで見つけましたが、どこにあるのかわかりません。


4
注意点として、save_formset-> set_userでは、hasattr(instance、 '
created_by

現在のユーザーをsettings.pyで取得できますか?
Mahendra Garg 2016年

どうしてそうするか?(新しい質問を作成してください、私のdjangoの時代は
もう過ぎ去り

@vikingosegundoなぜDjangoをもう使わないのか疑問に思っていましたか?もうバックエンド開発をしていませんか、それともNodeJSに移行しましたか?
アルファブラボー

1
何らかの理由で、内部関数を使用してset_userからそれをマッピングすることはできませんでしたinstances。新しいモデルをデータベースに保存しなかっただけです。私はループの内側のボディでを使用する必要がfor instance in instances: あり、set_user完璧に機能しました。また、そうあるif formset.model == Articleべきだと思いますif formset.model == Image。答えてくれてありがとう@vikingosegundo。これを解決するために何日もキーボードに頭をぶつけていました!!
ekauffmann

6

@vikingosegundoの答えを拡張して、Models内でユーザー名を取得したい場合は、ミドルウェアを宣言する方法を見つけました。get_username.pyこのコンテンツを使用して、アプリ内で呼び出されるファイルを作成します。

from threading import current_thread

_requests = {}

def get_username():
    t = current_thread()
    if t not in _requests:
         return None
    return _requests[t]

class RequestMiddleware(object):
    def process_request(self, request):
        _requests[current_thread()] = request

を編集settings.pyして、MIDDLEWARE_CLASSES:に追加します。

MIDDLEWARE_CLASSES = (
    ...
    'yourapp.get_username.RequestMiddleware',
)

これで、save()メソッドで、次のように現在のユーザー名を取得できます。

from get_username import get_username

...

def save(self, *args, **kwargs):
    req = get_username()
    print "Your username is: %s" % (req.user)


@nKnは、オブジェクトで呼び出すためget_username()に必要な本当に専用のミドルウェアModelsですか?もしそうなら、それに関する標準的なドキュメントへのリンクがあるといいでしょう。同じことをするために1.9.5で更新されたネイティブdjango関数はありますか?
alvas 2016年

5

Django1.9.6のデフォルトプロジェクトuserにはデフォルトのテンプレートがあります

したがって、次のようなものを直接書くことができます。

{% if user.is_authenticated %}
    {{ user.username }}
{% else %}
    Not logged in.
{% endif %}

この機能は、のdjango.contrib.auth.context_processors.authコンテキストプロセッサによって提供されますsettings.py

専用テンプレートの質問:Djangoテンプレートのユーザープロファイルにアクセスするにはどうすればよいですか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.