قم دائمًا بإرسال معلومات المستخدم في كل قالب Django
-
10-12-2019 - |
سؤال
لقد استخدمت نماذج معدة مسبقًا لتسجيل Django ولاحظت أن Django يفهم تلك الصفحات user
وأنا أفعل أشياء مثل user.is_authenticated
و user.username
.
حاولت النظر إلى views.py
رمز في كل من تسجيل جانغو و django.contrib.auth.views
, ، لكنني لم أتمكن من معرفة كيف يرسل هذان الشخصان دائمًا الرسالة user
المعلومات إلى القوالب.
يمكنني دائمًا إرسال صراحةً user
معلومات السياق لكل عرض، ولكن هذا من شأنه أن ينتهك مبدأ DRY.
حاولت استخدام هذا الحل, ، ولكن أحصل على خطأ قائلا
Put 'django.contrib.auth.context_processors.auth' in your TEMPLATE_CONTEXT_PROCESSORS setting in order to use the admin application.
وحتى لو وضعت المسار أعلاه بالداخل settings.py
مثله
TEMPLATE_CONTEXT_PROCESSORS = (
'django.contrib.auth.context_processors.auth',
'doors.processor_file_name.user',
)
قوالبي لا تزال لا تعرف عنها user
.
المحلول
اتضح أنه في كل مرة كنت أستخدمها render_to_response
في views.py
...
def order_all( request ) :
orders = Order.objects.all()
return render_to_response( 'doors/order/list.html', { 'orders' : orders } )
ال القاموس ليس أ RequestContext
.باستخدام أ RequestContext
سوف تشمل تلقائيا TEMPLATE_CONTEXT_PROCESSORS
, ، والتي في حالتي سوف تشمل django.contrib.auth.context_processors.auth
, ، والتي سوف تمر على طول user
المعلومات إلى كل قالب.
وبعبارة أخرى، أنا فقط بحاجة إلى تغيير الكود أعلاه إلى هذا
def order_all( request ) :
orders = Order.objects.all()
return render_to_response( 'doors/order/list.html', context_instance = RequestContext( request, { 'orders' : orders } ) )
لا تنسى الاستيراد RequestContext
أيضاً
from django.template import RequestContext
وتبين أيضًا أنني لست بحاجة إلى التضمين بشكل صريح django.contrib.auth.context_processors.auth
(أو أكتب عادتي doors.processor_file_name.user
) في ال TEMPLATE_CONTEXT_PROCESSORS
لأن django.contrib.auth.context_processors.auth
يتم تضمينه بشكل افتراضي
نصائح أخرى
أدرك أن هذا سؤال قديم، ولكن بالنسبة لأي شخص آخر يواجه هذه المشكلة، يمكنك استخدام "render" بدلاً من "render_to_response":
def order_all(request):
orders = Order.objects.all()
return render(request, 'doors/order/list.html', { 'orders': order })
وهذا أيضًا يلغي الحاجة إلى استيراد RequestContext.بحسب ال مستندات جانغو, ، "render" هو نفس "render_to_response"، ولكن يحتوي على وسيطة مثيل السياق التي تفرض استخدام RequestContext.