سؤال

أنا أعمل على موقع إنترانت صغير لشركة صغيرة، حيث يمكن للمستخدم النشر.لقد تخيلت آلية مصادقة بسيطة جدًا حيث يقوم الأشخاص فقط بإدخال عنوان بريدهم الإلكتروني، ويتم إرسال عنوان URL فريد لتسجيل الدخول، والذي يقوم بتعيين ملف تعريف الارتباط الذي سيحدد هويتهم دائمًا للطلبات المستقبلية.

في إعداد القالب الخاص بي، لدي base.html، والصفحات الأخرى توسع هذا.أرغب في إظهار زر تسجيل الدخول أو التسجيل في ملف base.html، ولكن كيف يمكنني التأكد من أن المتغيرات الضرورية تكون دائمًا جزءًا من السياق؟يبدو أن كل وجهة نظر تحدد السياق كما يحلو لها، ولا يوجد سياق عالمي.هل هناك طريقة للقيام بذلك دون تضمين المستخدم في كل عملية إنشاء سياق؟

أم هل سيتعين علي إنشاء اختصارات مخصصة خاصة بي لإعداد السياق بشكل صحيح؟

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

المحلول

بمعنى أكثر عمومية، وهو عدم الاضطرار إلى تعيين المتغيرات بشكل صريح في كل طريقة عرض، يبدو أنك تريد النظر في كتابة المتغيرات الخاصة بك معالج السياق.

من المستندات:

يحتوي معالج السياق على واجهة بسيطة جدًا:إنها مجرد وظيفة بايثون تأخذ وسيطة واحدة، وكائن HttpRequest، وترجع قاموسًا تتم إضافته إلى سياق القالب.يجب أن يقوم كل معالج سياق بإرجاع قاموس.

نصائح أخرى

هنالك لا حاجة لكتابة معالج سياق لكائن المستخدم إذا كان لديك بالفعل "django.core.context_processors.auth" في TEMPLATE_CONTEXT_PROCESSORS و إذا كنت تستخدم RequestContext في وجهات نظرك.

إذا كنت تستخدم Django 1.4 أو تم نقل الوحدة النمطية الأحدث إليها django.contrib.auth.context_processors.auth

@ريان:الوثائق حول المعالجات الأولية صغيرة بعض الشيء

@ ستال:إضافة مستخدم إلى السياق في كل مرة يتم فيها استدعاء القالب المعروض، DRY

الحل هو استخدام المعالج المسبق

أ:في الإعدادات الخاصة بك أضف

TEMPLATE_CONTEXT_PROCESSORS = (
    'myapp.processor_file_name.user',
)

ب:في myapp/processor_file_name.py أدخل

def user(request):
    if hasattr(request, 'user'):
        return {'user':request.user }
    return {}

من الآن فصاعدا، يمكنك استخدام وظائف كائن المستخدم في القوالب الخاصة بك.

{{ user.get_full_name }}

التلميحات موجودة في كل إجابة، ولكن مرة أخرى، من "الصفر"، للمبتدئين:

توجد بيانات المصادقة في القوالب (تقريبًا) افتراضيًا - مع خدعة صغيرة:

في views.py:

from django.template import RequestContext
...
def index(request):
    return render_to_response('index.html', 
                              {'var': 'value'},
                              context_instance=RequestContext(request))

في index.html:

...
Hi, {{ user.username }}
var: {{ value }}
... 

من هنا: https://docs.djangoproject.com/en/1.4/topics/auth/#authentication-data-in-templates

متغير سياق القالب هذا غير متاح إذا كان a سياق الطلب لا يتم استخدامه.

dave لاستخدام {{user.username}} في القوالب الخاصة بي ، سأضطر بعد ذلك إلى استخدام requestContext بدلاً من مجرد خريطة/تجزئة عادية: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext

لذلك أعتقد أنه لا توجد عوالم عالمية يقوم محرك القالب بفحصها.

لكن RequestContext يحتوي على بعض الفئات التي تم ملؤها مسبقًا والتي يمكنني البحث فيها لحل مشاكلي.شكرًا.

إذا كان بإمكانك ربط المصادقة الخاصة بك في نظام مصادقة جانغو ستكون قادرًا على الاستخدام request.user.

أعتقد أن هذا يجب أن يكون مجرد حالة اتصال authenticate() و login() بناءً على محتويات ملف تعريف الارتباط الخاص بك.

يحرر:@ Staale - أستخدم دائمًا locals() حيلة للسياق الخاص بي حتى تتمكن جميع القوالب الخاصة بي من رؤيتها request و حينئذ request.user.إذا لم تكن كذلك، فأعتقد أن الأمر لن يكون بهذه البساطة.

يمكن ذلك بشكل افتراضي، من خلال القيام بالخطوات التالية، تأكد من إضافة السياق "django.contrib.auth.context_processors.auth" في إعداداتك.بشكل افتراضي، تتم إضافته في settings.py، لذا يبدو هكذا

TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.core.context_processors.auth',)

ويمكنك الوصول إلى كائن المستخدم مثل هذا،

{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}

لمزيد من المعلومات، راجع هنا http://docs.djangoproject.com/en/1.2/topics/auth/#authentication-data-in-templates

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