اذهب إلى المحتوى

السؤال

نشر (معدل)

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

def home_page(request):
    categories = Category.objects.all()
    # ...
    return render_to_response('users/home_page.html', {'categories':categories})
  
def about_page(request):
    categories = Category.objects.all()
    # ...
    return render_to_response('users/about_page.html', {'categories':categories})

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

تم التعديل في بواسطة Mohssen A Mohssen

Recommended Posts

  • 1
نشر

لجعل مُتغير متاحاً في كل القوالب بشكل إفتراضي يجب إنشاء مُعالج سياق (context processor) جديد وإضافته إلى إعدادات جانغو. لفِعل ذلك نقوم بإنشاء ملف بايثون داخل تطبيق جانغو ونقوم بتسميته my_context_processors.py.

داخل الملف نقوم بكتابة الشفرة التالية:

from myapp.models import Category

def categories_processor(request):
	categories = Category.objects.all()         
	return {'categories': categories} # أنشأنا متغير جديد فيه كل المُنتجات
  

ثم نُضيف my_context_processors داخل ملف الإعدادات:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'OPTIONS': {
            'loaders': [
                ...
            ],
            'context_processors': [
                'django.template.context_processors.debug',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                "myapp.my_context_processors.categories_processor" # نُضيفه هنا
            ],
        },
    }
]

بهذا الشكل يكون categories مًتواجداً في كل القوالب.

  • 1
نشر

يمكنك إنشاء ملف context processor داخل django و يقوم النظام تلقائياً بإستدعاء ذلك الملف و تنفيذه في كل request يتم على السيرفر حيثُ يمكن إتباع الخطوات الآتيه :

  1. قم بإنشاء ملف يحمل الإسم الذي تفضله على سبيل المثال private_context_processor.py داخل التطبيق
  2. قم بفتح الملف و استدعي النموذج المراد التطبيق عليه من ملف models.py كالتالي :
from .models import Category

def categories_everywhere(request):
	my_categories = Category.objects.all()         
	return {'my_categories': my_categories}

3 . نقوم بتسجيل السطر 'home.private_context_processor.categories_everywhere' داخل اعدادات المشروع settings.py في قسم TEMPLATES كالتالي :

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': ['templates'],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                 'django.template.context_processors.i18n',
                'django.contrib.messages.context_processors.messages',
                'home.private_context_processor.categories_everywhere',
            ],
        },
    },
]

التفاصيل للسطر الذي تم تسجيلة :

  • home هو إسم التطبيق الذي تم إنشاء ملف private_context_processor.py به
  • private_context_processor هو اسم الملف الذي قمنا بإنشائه
  • categories_everywhere هي الدالة التي كتبناها داخل الملف

 4. ثم نذهب لأي ملف html داخل اي تطبيق في المشروع بشكل عام و نستدعي الـ context الذي يقوم بالتعويض عن الداله و يرجع بها في تلك الحاله my_categories حيثُ يُمكنك عمل for loop أو اي أمر من أوامر بايثون المتوافقة مع ال templates داخل التطبيق

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...