سؤال

لدي بعض الكود الذي يحصل على تسجيل الدخول الحالي في المستخدم.

userID = request.session.get("_auth_user_id")
    if userID:
        loggedin_user = User.objects.get(pk=int(userID))
    else:
        loggedin_user = None

أريد أن يظهر اسم المستخدم على كل صفحة.

في الوقت الحالي، أقوم بوضع التعليمات البرمجية في كل عرض ويمر كائن المستخدم إلى كل قالب

return render_to_response('index.html', {loggedin_user})

يبدو أن هذا يذهب ضد أخلاقيات Django الجافة. كيف يمكنني القيام بذلك مع تكرار نفسي؟

تحرير: ربما كان المستخدم مثالا سيئا.

ماذا لو كنت أرغب في الحصول على قائمة من الكائنات من قاعدة البيانات،

items = Item.objects.all()

وقم بإدراجها في كل علاقة.

هل يجب علي كتابة هذا الرمز وتمرير القائمة إلى القالب في كل عرض. أو هل يمكنني كتابة بعض الكود مرة واحدة من شأنها أن تجعل هذه القائمة متاحة لجميع القوالب؟

هل كانت مفيدة؟

المحلول

يجب عليك استخدام علامة قالب مخصصة لشيء من هذا القبيل. يمكنك جلب البيانات التي تحتاجها في العلامة المخصصة، وإرسالها إلى القالب. كل ما تحتاج إلى تذكره هو تحميل العلامة في ملف القالب الذي سيستخدمه فيه.

نصائح أخرى

معرف المستخدم موجود بالفعل داخل الجلسة. على هذا النحو، لا تحتاج إلى الاستمرار في تمريرها.

{{ request.session._auth_user_id }}

يجب أن يعمل ذلك، لكنك بحاجة إلى إضافة هذا في template_context_processors في ملف الإعدادات الخاص بك:

django.core.context_processors.request

في Render_to_Response، كنت بحاجة إلى إضافة الطلب كمعلمة. علي سبيل المثال:

 return render_to_response('test.html',{}, context_instance=RequestContext(request))

ماذا عن طلب؟

if request.user.is_authenticated():
    name = request.user.username
else:
    name = "Anonymous"

على أي حال، إذا لم تكن متوفرة بالفعل في Django، أقترح عليك كتابة فئة متوسطة تماما مثل django.contrib.sessions.middeware.sessionmiddyware أو django.contrib.auth.middyware.authenticationMiddlewareware. يغير هذا الفصل تفاصيل الطلب قبل إرسالها إلى عرض.

إذا كنت بحاجة إليها على أساس لكل عرض، فيمكنك كتابة ديكور للقيام بذلك بت صغير، و LECORATIONES الآراء التي تريدها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top