جانغو بالعربي
نظرًا لأن Django تم تطويره على خطى سريعة في بيئة newsroom ، فقد تم تصميمه لجعل مهام تطوير الويب الشائعة سريعة وسهلة. في ما يلي نظرة عامة غير رسمية حول كيفية كتابة تطبيق ويب معتمد على قاعدة البيانات مع Django.
الهدف من هذه الوثيقة هو إعطائك ما يكفي من التفاصيل الفنية لفهم كيفية عمل Django ، ولكن هذا ليس المقصود أن يكون برنامجًا تعليميًا أو مرجعًا - ولكننا حصلنا على كليهما! عندما تكون مستعدًا لبدء مشروع ، يمكنك البدء بالبرنامج التعليمي أو الغوص في مزيد من الوثائق التفصيلية.
تصميم نموذجك
على الرغم من أنه يمكنك استخدام Django بدون قاعدة بيانات ، إلا أنه يأتي مع أداة تخطيط object-relational حيث تصف تخطيط قاعدة البيانات الخاص بك في رمز Python.تقدم بنية نموذج البيانات العديد من الطرق الغنية لتمثيل نماذجك - حتى الآن ، تم حل العديد من المشكلات المتعلقة بقاعدة البيانات في سنوات عديدة. إليك مثال سريع:
from django.db import models
class Reporter(models.Model):
full_name = models.CharField(max_length=70)
def __str__(self):
return self.full_name
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
def __str__(self):
return self.headline
تحميله
بعد ذلك ، قم بتشغيل الأداة المساعدة لسطر الأوامر Django لإنشاء جداول قاعدة البيانات تلقائيًا:
في الويندوز
...\> py manage.py migrate
في اللينكس والماك
$ python manage.py migrate
يبحث أمر الترحيل migrate في جميع النماذج المتاحة لديك وينشئ الجداول في قاعدة البيانات الخاصة بك، بالإضافة إلى توفير عنصر تحكم مخطط أكثر ثراء.
استمتع باستخدام API¶ المجاني
وبذلك ، لديك واجهة برمجة تطبيقات بايثون مجانية وغنية للوصول إلى بياناتك. يتم إنشاء واجهة برمجة التطبيقات على الطاير ، لا يلزم إنشاء تعليمة برمجية:# Import the models we created from our "news" app >>> from news.models import Article, Reporter # No reporters are in the system yet. >>> Reporter.objects.all() <QuerySet []> # Create a new Reporter. >>> r = Reporter(full_name='John Smith') # Save the object into the database. You have to call save() explicitly. >>> r.save() # Now it has an ID. >>> r.id 1 # Now the new reporter is in the database. >>> Reporter.objects.all() <QuerySet [<Reporter: John Smith>]> # Fields are represented as attributes on the Python object. >>> r.full_name 'John Smith' # Django provides a rich database lookup API. >>> Reporter.objects.get(id=1) <Reporter: John Smith> >>> Reporter.objects.get(full_name__startswith='John') <Reporter: John Smith> >>> Reporter.objects.get(full_name__contains='mith') <Reporter: John Smith> >>> Reporter.objects.get(id=2) Traceback (most recent call last): ... DoesNotExist: Reporter matching query does not exist. # انشاء مقالة >>> from datetime import date >>> a = Article(pub_date=date.today(), headline='Django is cool', ... content='Yeah.', reporter=r) >>> a.save() # الآن هذه المقالة في قاعدة البيانات >>> Article.objects.all() <QuerySet [<Article: Django is cool>]> # Article objects get API access to related Reporter objects. >>> r = a.reporter >>> r.full_name 'John Smith'# والعكس صحيح: الحصول على كائنات عارض التقارير (API) الوصول إلى كائنات المقالة.>>> r.article_set.all() <QuerySet [<Article: Django is cool>]># يتبع API العلاقات بقدر ما تحتاج ، وأداء فعال# ينضم لك وراء الكواليس.# يجد كل المقالات من قبل مراسل يبدأ اسمه بـ "john".>>> Article.objects.filter(reporter__full_name__startswith='John') <QuerySet [<Article: Django is cool>]># تغيير كائن عن طريق تغيير سماته والاتصال ب save()>>> r.full_name = 'Billy Goat' >>> r.save()# حذف كائن مع delete ().>>> r.delete()
واجهة إدارة ديناميكية: إنها ليست مجرد سقالات - إنها المنزل بأكمله
بمجرد تحديد النماذج الخاصة بك ، يمكن لـ Django إنشاء واجهة إدارية جاهزة للإنتاج ، وهي عبارة عن موقع يتيح للمستخدمين المصادقين إمكانية إضافة الكائنات وتغييرها وحذفها. الأمر سهل مثل تسجيل نموذجك في موقع المشرف:from django.db import models
class Article(models.Model):
pub_date = models.DateField()
headline = models.CharField(max_length=200)
content = models.TextField()
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
from django.contrib import admin
from . import models
admin.site.register(models.Article)
تتمثل الفلسفة هنا في أن موقعك يتم تعديله بواسطة أحد الموظفين أو أحد العملاء أو ربما أنت فقط - ولا ترغب في التعامل مع إنشاء واجهات خلفية لإدارة المحتوى فقط.
أحد سير العمل المعتاد في إنشاء تطبيقات Django هو إنشاء نماذج والحصول على وتشغيل مواقع الإدارة في أسرع وقت ممكن ، بحيث يمكن للموظفين (أو العملاء) البدء في ملء البيانات. ثم قم بتطوير طريقة عرض البيانات للجمهور.
تصميم عناوين URL الخاصة بك
يمثل نظام عنوان URL النظيف والأنيق تفصيلاً هامًا في تطبيق ويب عالي الجودة. يشجع Django تصميم عنوان URL الجميل ولا يضع أي روابط في عناوين URL ، مثل .php أو .asp.لتصميم عناوين URL لتطبيق ، يمكنك إنشاء وحدة Python تسمى URLconf. جدول محتويات لتطبيقك ، ويحتوي على مخطط بسيط بين أنماط عناوين URL ووظائف رد الاتصال في Python. تعمل URLconfs أيضًا على فصل عناوين URL من شفرة Python.
في ما يلي الشكل الذي قد يبدو عليه URLconf لمثال المراسل / المقالة أعلاه:
from django.urls import path
from . import views
urlpatterns = [
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<int:pk>/', views.article_detail),
]
يقوم الكود أعلاه بتخطيط مسارات عناوين URL لوظائف استدعاء Python ("طرق العرض") views . تستخدم سلاسل المسار علامات المعلمات "لالتقاط" القيم من عناوين URL. عندما يطلب المستخدم صفحة ، يعمل Django عبر كل مسار ، بالترتيب ، ويتوقف عند أول واحد يطابق عنوان URL المطلوب. (إذا لم تتطابق أي منها ، فإن Django يستدعي عرض 404 حالة خاصة). هذا سريع جدًا ، نظرًا لأن المسارات يتم تجميعها في التعبيرات العادية في وقت التحميل.
بمجرد تطابق أحد أنماط عنوان URL ، يستدعي Django العرض المعطى ، وهو عبارة عن وظيفة Python. يتم تمرير كل عرض كائن طلب - الذي يحتوي على بيانات تعريف الطلب - والقيم التي تم التقاطها في هذا النمط.
على سبيل المثال ، إذا طلب أحد المستخدمين عنوان URL "/ articles / 2005/05/39323 /" ، فإن Django سيتصل بالوظيفة news.views.article_detail (request، year = 2005، month = 5، pk = 39323).
اكتب ال views الخاصة بك
كل view مسؤولة عن تنفيذ أحد أمرين: إرجاع كائن HttpResponse يحتوي على محتوى الصفحة المطلوبة أو رفع استثناء مثل Http404. الباقي متروك لك.بشكل عام ، يسترد ال views وفقًا للمعلمات ، ويحمّل قالبًا ويعرض القالب بالبيانات المسترجعة. في ما يلي مثال على طريقة عرض year_archive من أعلاه:
from django.shortcuts import render
from .models import Article
def year_archive(request, year):
a_list = Article.objects.filter(pub_date__year=year)
context = {'year': year, 'article_list': a_list}
return render(request, 'news/year_archive.html', context)
يستخدم هذا المثال نظام قالب Django ، الذي يحتوي على العديد من الميزات القوية ولكنه يسعى إلى البقاء بسيطًا بما فيه الكفاية ليستخدمه غير المبرمجين.
تصميم النماذج الخاصة بك¶
تحمّل الشفرة أعلاه نموذج news /arch_archive.html.يحتوي Django على مسار للبحث عن قالب ، والذي يسمح لك بتقليل التكرار بين النماذج. في إعدادات Django ، يمكنك تحديد قائمة بالدلائل للتحقق من القوالب باستخدام DIRS. إذا كان القالب غير موجود في الدليل الأول ، فإنه يتحقق من الثاني ، وهكذا.
لنفترض أنه تم العثور على news /arch_archive.html النموذج. وإليك ما قد يبدو عليه الأمر:
{% extends "base.html" %}
{% block title %}Articles for {{ year }}{% endblock %}
{% block content %}
<h1>Articles for {{ year }}</h1>
{% for article in article_list %}
<p>{{ article.headline }}</p>
<p>By {{ article.reporter.full_name }}</p>
<p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}
المتغيرات محاطة بأقواس مزدوجة التعرج. {{article.headline}} تعني "إخراج قيمة سمة عنوان المقالة". ولكن لا يتم استخدام النقاط إلا في البحث عن السمة. يمكنهم أيضا القيام بحث القاموس ، والبحث عن الفهرسة والمكالمات الدالة.
ملاحظة {{article.pub_date | date: "F j، Y"}} يستخدم "pipe" على نمط Unix (الحرف "|"). وهذا ما يسمى فلتر نموذج ، وهي طريقة لتصفية قيمة المتغير. في هذه الحالة ، يقوم مرشح التاريخ بتنسيق كائن تاريخ / وقت بيثون في التنسيق المحدد (كما هو موجود في وظيفة تاريخ PHP).
يمكنك تجميع العديد من الفلاتر حسب رغبتك. يمكنك كتابة فلاتر قالب مخصص. يمكنك كتابة علامات قالب مخصص ، والتي تقوم بتشغيل شفرة Python مخصصة خلف الكواليس.
وأخيرًا ، يستخدم Django مفهوم "توريث القالب". وهو ما يفعله {٪ "extends "base.html٪}. يعني "أولاً تحميل القالب الذي يطلق عليه" القاعدة "، والذي عرّف مجموعة من الكتل ، واملأ الكتل بالكتل التالية". باختصار ، هذا يتيح لك تقليل التكرار بشكل كبير في النماذج: كل قالب يجب أن يحدد فقط ما هو فريد لهذا القالب.
في ما يلي نموذج "base.html" ، بما في ذلك استخدام الملفات الثابتة ، قد يبدو كالتالي:
{% load static %}
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<img src="{% static "images/sitelogo.png" %}" alt="Logo">
{% block content %}{% endblock %}
</body>
</html>
وبشكل مبسّط ، يعرّف الموقع مظهر وشعور الموقع (مع شعار الموقع) ، ويوفر "ثغرات" لنماذج الطفل لملئها. هذا يجعل إعادة تصميم الموقع سهلاً مثل تغيير ملف واحد - القالب الأساسي.
كما يتيح لك أيضًا إنشاء إصدارات متعددة من موقع ، باستخدام قوالب أساسية مختلفة ، أثناء إعادة استخدام القوالب الفرعية. استخدم منشئو Django هذه التقنية لإنشاء إصدارات مختلفة للهواتف المحمولة بشكل ملفت للنظر - ببساطة عن طريق إنشاء قالب أساسي جديد.
لاحظ أنك لست مضطرًا لاستخدام نظام قالب Django إذا كنت تفضل نظامًا آخر. في حين أن نظام قالب دجانجو مدمج بشكل خاص مع طبقة نموذج جانغو ، فلا شيء يدفعك إلى استخدامها. في هذا الصدد ، لا يتعين عليك استخدام واجهة برمجة التطبيقات لقاعدة بيانات Django أيضًا. يمكنك استخدام طبقة تجريد قاعدة بيانات أخرى ، يمكنك قراءة ملفات XML ، يمكنك قراءة الملفات من القرص ، أو أي شيء تريده. يتم فصل كل جزء من Django - نماذج وجهات النظر والقوالب - عن التالي.