<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Django</title><link>https://academy.hsoub.com/programming/python/django/page/3/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Django</description><language>ar</language><item><title>&#x627;&#x644;&#x646;&#x645;&#x627;&#x630;&#x62C; Models &#x648;&#x627;&#x644;&#x627;&#x633;&#x62A;&#x639;&#x644;&#x627;&#x645; &#x639;&#x646; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x641;&#x64A; Django</title><link>https://academy.hsoub.com/programming/python/django/%D8%A7%D9%84%D9%86%D9%85%D8%A7%D8%B0%D8%AC-models-%D9%88%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85-%D8%B9%D9%86-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-django-r405/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_01/django-3.png.2cd8348e3a8f12f3b13797005653405d.png" /></p>
<p id="النماذج-models-والاستعلام-عن-البيانات-في-django">
	تحدثنا في الدرسين السابقين عن كيفية تنصيب وإعداد إطار العمل Django على أنظمة التشغيل المختلفة، وتعرفنا كذلك على مفهومي المشروع والتطبيق، وقمنا بكتابة العرض الأول وتعرفنا بشكل مختصر على المساراتUrls.
</p>

<p>
	وفي الجزء الثالث من هذه السلسلة، سنتطرق إلى النماذج Models وكيفية التعامل مع قواعد البيانات من خلال Django، وسنتعرف خلال الدرس على طريقة ربط قواعد البيانات المختلفة مع Django، وكيفية إنشاء النماذج والتعامل معها وسنتطرق كذلك إلى مفهوم تهجير قواعد البيانات Migration، وسننشئ النموذج الخاص بتطبيق الاقتراعات والذي سيحتضن الأسئلة الخاصة بالاقتراع إضافة إلى الإجابات المرتبطة بالسؤال.
</p>

<p style="text-align: center;">
	<img alt="django-3.png" class="ipsImage ipsImage_thumbnailed" data-fileid="20596" data-unique="joe2ww1hb" src="https://academy.hsoub.com/uploads/monthly_2017_01/django-3.png.6a4d436caa66c5b2d2d80c888e630601.png">
</p>

<h2 id="النماذج-models">
	النماذج Models
</h2>

<p>
	أشرنا في الدروس السابقة إلى أن إطار العمل Django يتبع مبدأ العمل MVT، ويشير الحرف M هنا إلى النماذج Models، ويمكن تعريف النماذج بشكل مبسط على أنها وصف للبيانات الموجودة في قاعدة البيانات باستخدام لغة Python، وبمعنى آخر تمثّل النماذج في Django بنية قاعدة البيانات، أي ما ستحصل عليه من إجراء الأمر <code>CREATE TABLE</code> ولكن بلغة Python بدلًا من SQL.
</p>

<p>
	يستخدم Django النماذج في التواصل مع قواعد البيانات من خلال تنفيذ أوامر SQL خلف الكواليس وتقديم النتائج التي ترد من هذه الأوامر على هيئة بنية من البيانات تمثل الصفوف في جداول قاعدة البيانات.
</p>

<p>
	ولهذا الأسلوب في التعامل مع قواعد البيانات بعض الفوائد، فكتابة النماذج بلغة Python يزيد في الانتاجية، إذ لن يكون المبرمج مضطرًا إلى اتباع قواعد لغة أخرى أثناء العمل على التطبيق ويكون العمل مقتصرًا على لغة python، كما يسهل هذا الأسلوب متابعة النماذج وتتبع التغييرات الحاصلة عليها من خلال أنظمة تتبع الإصدارات كـ Git وغيرها، إضافة إلى ذلك تقدم نماذج Python بعض أنواع البيانات غير المتوفرة في SQL كالبريد الإلكتروني وعناوين URL وغيرها.
</p>

<h2 id="ربط-django-مع-قواعد-البيانات">
	ربط Django مع قواعد البيانات
</h2>

<p>
	يستطيع Django التعامل مع أنواع مختلفة من أنظمة قواعد البيانات، ومن أشهرها SQLite، MySQL، PostgreSQL و Oracle. وفي مشروعنا هذا سنستخدم قواعد بيانات SQLite والتي تعتبر الخيار الأبسط والأسهل في حالة المشاريع البسيطة والصغيرة ويتم تثبيتها عند تثبيت Python وهذا يعني عدم الحاجة إلى تثبيت أي حزم إضافية، كما أنها ليست بحاجة إلى خادوم خاص تعمل من خلاله.<br>
	يمكن اختيار نوع قاعدة البيانات التي سيعمل عليها المشروع من خلال ملف الإعدادات settings.py، وذلك ضمن القاموس DATABASES.
</p>

<p>
	يستخدم Django قواعد بيانات SQLite بشكل افتراضي، وستجد قاموس DATABASES بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_7"><span class="pln">DATABASES </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="str">'default'</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">'ENGINE'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'django.db.backends.sqlite3'</span><span class="pun">,</span><span class="pln">
        </span><span class="str">'NAME'</span><span class="pun">:</span><span class="pln"> os</span><span class="pun">.</span><span class="pln">path</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="pln">BASE_DIR</span><span class="pun">,</span><span class="pln"> </span><span class="str">'db.sqlite3'</span><span class="pun">),</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يتطلب ربط Django بقواعد البيانات الأخرى كـ MySQL و PostgreSQL تثبيت حزم الربط الخاصة بكل نوع منها، وإضافة العناصر ‘USER’، ‘PASSWORD’، و’HOST’ إلى القاموس، ويمكن التعرف إلى الحزم المطلوبة لكل نوع من<a href="https://academy.hsoub.com/devops/servers/databases/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D9%82%D9%88%D8%A7%D8%B9%D8%AF-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA/" rel=""> أنواع قواعد البيانات </a>في <a href="https://docs.djangoproject.com/en/1.9/topics/install/#database-installation" rel="external nofollow">توثيقات Django.</a>
</p>

<h2 id="إنشاء-النموذج-الأول">
	إنشاء النموذج الأول
</h2>

<p>
	سيعتمد تطبيق الاقتراعات على نموذجين فقط هما نموذج الأسئلة ونموذج الإجابات، وسيتضمن النموذج الأول السؤال وتاريخ نشره، أما النموذج الثاني فسيتضمن الإجابات ومجموع الأصوات على كل إجابة، وسترتبط كل إجابة بسؤال معين.<br>
	افتح ملف <code>models.py</code> في محرر النصوص المفضل لديك، ثم أضف الأسطر التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_9"><span class="kwd">class</span><span class="pln"> </span><span class="typ">Question</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    question_text </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">200</span><span class="pun">)</span><span class="pln">
    pub_date </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">DateTimeField</span><span class="pun">(</span><span class="str">'date published'</span><span class="pun">)</span><span class="pln">


</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Choice</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    question </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">ForeignKey</span><span class="pun">(</span><span class="typ">Question</span><span class="pun">)</span><span class="pln">
    choice_text </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">CharField</span><span class="pun">(</span><span class="pln">max_length</span><span class="pun">=</span><span class="lit">200</span><span class="pun">)</span><span class="pln">
    votes </span><span class="pun">=</span><span class="pln"> models</span><span class="pun">.</span><span class="typ">IntegerField</span><span class="pun">(</span><span class="pln">default</span><span class="pun">=</span><span class="lit">0</span><span class="pun">)</span></pre>

<p>
	يمكن أن نلاحظ أن كل نموذج في هذا الملف قد تم تمثيله بصنف والذي يمثل بدوره جدولًا في قاعدة البيانات، ويتضمن كل صنف عددًا من المتغيرات التي يمكن استخدامها في شيفرة Python حسب الحاجة إليها، كما تمثل اسم العمود في قاعدة البيانات.<br>
	تمثل أسماء المتغيرات التي استخدمناها في الشيفرة السابقة أسماء الأعمدة في قواعد البيانات، وسنستخدم هذه الأسماء في شيفرة Python وستظهر كذلك في لوحة التحكم التي سنتحدث عنها مفصّلًا في الدروس القادمة، ويمكن التحكم في طريقة عرض هذه الأسماء في لوحة التحكم وذلك باستخدام معامل يجب تعيين قيمته قبل أي معامل آخر، كما فعلنا مع المتغير <code>pub_date</code> أعلاه، وبهذه الطريقة سيظهر هذا الحقل في لوحة التحكم بالاس<code>م date published</code> وليس <code>pub_date</code>.
</p>

<p>
	نلاحظ في الشيفرة السابقة أيضًا أننا عرّفنا علاقة تربط بين الإجابات وبين السؤال الخاص بها، وذلك باستخدام <code>ForeignKey</code> والتي تخبر Django بأن كل إجابة ترتبط بسؤال واحد فقط.
</p>

<p>
	تمتلك بعض أنواع الصنف <code>Field</code> عددًا من المعاملات الإلزامية، كما هو الحال مع <code>CharField</code> والذي يتطلب تحديد العدد الأقصى للحروف من خلال <code>max_length</code>. وبطبيعة الحالة تمتلك هذه الأصناف بعض المعاملات الاختيارية، كما هو الحال مع <code>IntegerField</code> الذي أضفنا إليه قيمة افتراضية مساوية للصفر من خلال <code>default=0</code>.
</p>

<p>
	يتم تمثيل كل حقل من حقول قاعدة البيانات بـ instance للصنف <code>Field</code>، مثل <code>CharField</code> لحقول الحروف، و <code>DateTimeField</code> لحقول التاريخ والوقت.
</p>

<p>
	يقدّم Django عددًا كبيرًا ومتنوعًا من أنواع الحقول، نورد فيما يلي بعضًا منها:
</p>

<table>
	<tbody>
		<tr>
			<td>
				الحقل
			</td>
			<td>
				الوظيفة
			</td>
		</tr>
		<tr>
			<td>
				BooleanField
			</td>
			<td>
				يتضمن قيمتي True و False، وعادة ما يكون مرتبطًا بمربع الاختيار Checkbox.
			</td>
		</tr>
		<tr>
			<td>
				CharField
			</td>
			<td>
				يستخدم هذا الحقل لإضافة السلاسل النصية Strings القصيرة والمتوسطة الحجم.
			</td>
		</tr>
		<tr>
			<td>
				DateField
			</td>
			<td>
				يستخدم للتعبير عن التاريخ.
			</td>
		</tr>
		<tr>
			<td>
				DateTimeField
			</td>
			<td>
				يستخدم للتعبير عن التاريخ الوقت.
			</td>
		</tr>
		<tr>
			<td>
				DecimalField
			</td>
			<td>
				يتيح استخدام الأرقام العشرية التي تحتوي على فواصل.
			</td>
		</tr>
		<tr>
			<td>
				EmailField
			</td>
			<td>
				عبارة عن حقل حرفي `CharField` ولكنه قادر على التحقق من أن القيمة المدخلة تمتلك صيغة بريد إلكتروني سليمة.
			</td>
		</tr>
		<tr>
			<td>
				FileField
			</td>
			<td>
				يستخدم هذا الحقل لاحتواء الملفات المرفوعة.
			</td>
		</tr>
		<tr>
			<td>
				IntegerField
			</td>
			<td>
				يتيح استخدام الأرقام الصحيحة، ويمكن استخدام الأرقام من -2147483648 إلى 2147483647 بشكل آمن مع أنظمة قواعد البيانات المختلفة.
			</td>
		</tr>
		<tr>
			<td>
				GenericIPAddressField
			</td>
			<td>
				عبارة عن عنوان IPv4 أو IPv6 على هيئة سلسلة نصية.
			</td>
		</tr>
		<tr>
			<td>
				SlugField
			</td>
			<td>
				حقل Slug.
			</td>
		</tr>
		<tr>
			<td>
				TextField
			</td>
			<td>
				يستخدم في لإضافة السلاسل النصية الطويلة.
			</td>
		</tr>
		<tr>
			<td>
				TimeField
			</td>
			<td>
				يستخدم للتعبير عن الوقت.
			</td>
		</tr>
		<tr>
			<td>
				URLField
			</td>
			<td>
				عبارة عن حقل حرفي يتضمن عنوان URL.
			</td>
		</tr>
	</tbody>
</table>

<h2 id="تفعيل-النموذج">
	تفعيل النموذج
</h2>

<p>
	تستطيع الشيفرة السابقة القيام بأمور كثيرة، حيث يمكن لـ Django أن:
</p>

<ul>
	<li>
		ينشئ جدولًا جديدًا خاصًّا بتطبيقنا هذا وذلك بتنفيذ العبارة <code>CREATE TABLE</code>.
	</li>
	<li>
		إنشاء واجهة برمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> خاصة يمكن من خلالها التعامل مع قاعدة البيانات التي تم إنشاؤها.
	</li>
</ul>

<p>
	ولكن قبل أن يشرع Django بأداء هذه المهام، يجب علينا تثبيت تطبيق polls في مشروعنا وذلك من خلال إدراج اسمه ضمن قائمة <code>INSTALLED_APPS</code> في ملف الإعدادات <code>settings.py</code>، لذا توجه إلى هذا الملف وابحث عن القائمة التي تحمل الاسم <code>INSTALLED_APPS</code>، ثم عدل عناصرها لتصبح بالشكل التالي:
</p>

<ul>
	<li>
		<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_16"><span class="pln">INSTALLED_APPS </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    </span><span class="str">'django.contrib.admin'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'django.contrib.auth'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'django.contrib.contenttypes'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'django.contrib.sessions'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'django.contrib.messages'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'django.contrib.staticfiles'</span><span class="pun">,</span><span class="pln">
    </span><span class="str">'polls'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">]</span></pre>

		<p>
			 
		</p>
	</li>
</ul>

<p>
	توجّه الآن إلى مجلد المشروع عن طريق سطر الأوامر ونفّذ الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_14"><span class="pln">python manage</span><span class="pun">.</span><span class="pln">py makemigrations polls</span></pre>

<p>
	يفترض أن ترى النتيجة التالية في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_17"><span class="typ">Migrations</span><span class="pln"> </span><span class="kwd">for</span><span class="pln"> </span><span class="str">'polls'</span><span class="pun">:</span><span class="pln">
  polls</span><span class="pun">/</span><span class="pln">migrations</span><span class="pun">/</span><span class="lit">0001</span><span class="pln">_initial</span><span class="pun">.</span><span class="pln">py</span><span class="pun">:</span><span class="pln">
    </span><span class="pun">-</span><span class="pln"> </span><span class="typ">Create</span><span class="pln"> model </span><span class="typ">Choice</span><span class="pln">
    </span><span class="pun">-</span><span class="pln"> </span><span class="typ">Create</span><span class="pln"> model </span><span class="typ">Question</span><span class="pln">
    </span><span class="pun">-</span><span class="pln"> </span><span class="typ">Add</span><span class="pln"> field question to choice</span></pre>

<p>
	وظيفة الأمر <code>makemigrations</code> هي إخبار Django بأنّك قد أجريت بعض التعديلات على النماذج وأنّك ترغب في حفظ هذه التعديلات على هيئة ملف تهجير يُحفظ على القرص الصلب كملف بايثون في مجلد <code>migrations</code>، تحت اسم: <code>0001_initial.py</code>.
</p>

<p>
	والآن نفّذ الأمر التالي في سطر الأوامر وذلك لتنفيذ التهجيرات وإنشاء الجداول ضمن قاعدة البيانات:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_19"><span class="pln">python manage</span><span class="pun">.</span><span class="pln">py migrate</span></pre>

<p>
	يفترض أن تظهر النتيجة التالية في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_21"><span class="typ">Operations</span><span class="pln"> to perform</span><span class="pun">:</span><span class="pln">
  </span><span class="typ">Apply</span><span class="pln"> all migrations</span><span class="pun">:</span><span class="pln"> admin</span><span class="pun">,</span><span class="pln"> auth</span><span class="pun">,</span><span class="pln"> contenttypes</span><span class="pun">,</span><span class="pln"> polls</span><span class="pun">,</span><span class="pln"> sessions
</span><span class="typ">Running</span><span class="pln"> migrations</span><span class="pun">:</span><span class="pln">
  </span><span class="typ">Rendering</span><span class="pln"> model states</span><span class="pun">...</span><span class="pln"> DONE
  </span><span class="typ">Applying</span><span class="pln"> polls</span><span class="pun">.</span><span class="lit">0001</span><span class="pln">_initial</span><span class="pun">...</span><span class="pln"> OK</span></pre>

<p>
	تتلخص وظيفة الأمر <code>migrate</code> في البحث عن التهجيرات غير المنفّذة (يتابع Django التهجيرات غير المنفّذة من خلال جدول خاص في قاعدة البيانات يحمل الاسم <code>django_migrations</code>) وإجرائها على قاعدة البيانات، سواء أكانت هذه التهجيرات تتضمن إنشاء جداول جديدة أو تعديل وتحديث جداول موجودة بالفعل.
</p>

<p>
	إذًا يمكن تلخيص عملية إجراء التعديلات على النماذج بالخطوات الثلاثة التالية:
</p>

<ol>
	<li>
		إجراء التعديلات على النموذج في ملف <code>models.py</code>.
	</li>
	<li>
		تنفيذ الأمر <code>python manage.py makemigrations</code> لإنشاء التهجيرات المرتبطة بالتعديلات التي تم إجراؤها على النموذج.
	</li>
	<li>
		تنفيذ الأمر <code>python manage.py migrate</code> لتطبيق هذه التعديلات على قاعدة البيانات.
	</li>
</ol>

<h2 id="الواجهة-البرمجية-الخاصة-بالتعامل-مع-قاعدة-البيانات">
	الواجهة البرمجية الخاصة بالتعامل مع قاعدة البيانات
</h2>

<p>
	ذكرنا سابقًا بأن لدى Django واجهة برمجية للتعامل مع قاعدة البيانات، وأفضل طريقة للتعرف على هذه الواجهة هي التعامل المباشر معها من خلال سطر الأوامر وعن طريق صدفة Python.
</p>

<p>
	للولوج إلى الصدفة نفّذ الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4708_23"><span class="pln">python manage.py shell</span></pre>

<p>
	أولًا يجب استيراد صنفي النموذج Question و Choice، كما سنحتاج إلى حزمة <code>timezone</code> من مكتبة <code>django.utils</code> للتعامل مع الوقت والتاريخ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_26"><span class="kwd">from</span><span class="pln"> polls</span><span class="pun">.</span><span class="pln">models </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Question</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Choice</span><span class="pln">
</span><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">utils </span><span class="kwd">import</span><span class="pln"> timezone</span></pre>

<p>
	يمكن الاستعلام عن جميع الأسئلة الموجودة في جدول Question من خلال الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_28"><span class="typ">Question</span><span class="pun">.</span><span class="pln">objects</span><span class="pun">.</span><span class="pln">all</span><span class="pun">()</span></pre>

<p>
	وباعتبار أن قاعدة البيانات الخاصة بتطبيقنا هذا خالية تمامًا من الأسئلة، فسنحصل على النتيجة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_29"><span class="pun">&lt;</span><span class="typ">QuerySet</span><span class="pln"> </span><span class="pun">[]&gt;</span></pre>

<p>
	لإنشاء السؤال الأول سنقوم بإنشاء كائن من الصنف Question مع تعريف قيم المعاملات المستخدمة في هذا الصنف وإسناد هذا الكائن إلى متغير، وكما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_30"><span class="pln">q </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Question</span><span class="pun">(</span><span class="pln">question_text</span><span class="pun">=</span><span class="str">"What's new?"</span><span class="pun">,</span><span class="pln"> pub_date</span><span class="pun">=</span><span class="pln">timezone</span><span class="pun">.</span><span class="pln">now</span><span class="pun">())</span></pre>

<p>
	يمكن الآن حفظ السؤال الجديد في قاعدة البيانات من خلال الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_32"><span class="pln">q</span><span class="pun">.</span><span class="pln">save</span><span class="pun">()</span></pre>

<p>
	والآن، يمكن الوصول إلى جميع المعلومات الخاصة بهذا السؤال وبالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_36"><span class="com">#الحصول على نص السؤال</span><span class="pln">
q</span><span class="pun">.</span><span class="pln">question_text
</span><span class="com">#الحصول على تاريخ نشر السؤال</span><span class="pln">
q</span><span class="pun">.</span><span class="pln">pub_date
</span><span class="com"># تغيير نص السؤال</span><span class="pln">
q</span><span class="pun">.</span><span class="pln">question_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"What’s up?"</span><span class="pln">
q</span><span class="pun">.</span><span class="pln">save</span><span class="pun">()</span></pre>

<p>
	بعد أن أضفنا سؤالًا إلى قاعدة البيانات، سنجري استعلامًا عن جميع الأسئلة في النموذج Question:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_38"><span class="typ">Question</span><span class="pun">.</span><span class="pln">objects</span><span class="pun">.</span><span class="pln">all</span><span class="pun">()</span><span class="pln">
</span><span class="com">#ستحصل على النتيجة التالية</span><span class="pln">
</span><span class="pun">&lt;</span><span class="typ">QuerySet</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="typ">Question</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Question</span><span class="pln"> object</span><span class="pun">&gt;]&gt;</span></pre>

<p>
	نلاحظ أن النتيجة التي حصلنا عليها غريبة بعض الشيء، فالسؤال الذي أضفناه قبل قليل لم يظهر ضمن قائمة الأسئلة، ولحل هذه المشكلة سنحتاج إلى إضافة تابع <code>__str()__</code> إلى كلا الصنفين، وبالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_40"><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">db </span><span class="kwd">import</span><span class="pln"> models
</span><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">utils</span><span class="pun">.</span><span class="pln">encoding </span><span class="kwd">import</span><span class="pln"> python_2_unicode_compatible

</span><span class="lit">@python_2_unicode_compatible</span><span class="pln">  </span><span class="com"># إن كنت بحاجة إلى استخدام الإصدار الثاني من بايثون</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Question</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># ...</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> __str__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">question_text

</span><span class="lit">@python_2_unicode_compatible</span><span class="pln">  </span><span class="com"># إن كنت بحاجة إلى استخدام الإصدار الثاني من بايثون</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Choice</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># ...</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> __str__</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">choice_text</span></pre>

<p>
	من الضروري استخدام التابع <code>__str__()</code> عند التعامل مع النماذج، لأن نتيجة هذا التابع ستظهر في لوحة التحكم التي يتم إنشائها آليًا من خلال هذه النماذج.
</p>

<p>
	وكما قمنا باستخدام أحد التوابع المعرفة مسبقًا في Django فبمقدورنا أن نستخدم توابع مخصّصة تؤدي وظائف ومهام مختلفة، ولتوضيح ذلك، قم باستيراد مكتبة <code>datetime</code> الخاصة بـ Python، ثم أضف الشيفرة التالية في نهاية الصنف Question:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_42"><span class="kwd">import</span><span class="pln"> datetime
</span><span class="com"># ...</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Question</span><span class="pun">(</span><span class="pln">models</span><span class="pun">.</span><span class="typ">Model</span><span class="pun">):</span><span class="pln">
    </span><span class="com"># ...</span><span class="pln">
    </span><span class="kwd">def</span><span class="pln"> was_published_recently</span><span class="pun">(</span><span class="pln">self</span><span class="pun">):</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> self</span><span class="pun">.</span><span class="pln">pub_date </span><span class="pun">&gt;=</span><span class="pln"> timezone</span><span class="pun">.</span><span class="pln">now</span><span class="pun">()</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> datetime</span><span class="pun">.</span><span class="pln">timedelta</span><span class="pun">(</span><span class="pln">days</span><span class="pun">=</span><span class="lit">1</span><span class="pun">)</span></pre>

<p>
	سيقوم هذا التابع بالتحقق من أن السؤال قد تم نشره مؤخّرًا (منذ يوم) أو منذ فترة بعيدة (أكثر من يوم).
</p>

<p>
	والآن يمكن استدعاء تابعنا المخصص الجديد بنفس الطريقة التي استدعينا من خلالها تابع الحفظ:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_44"><span class="pln">q</span><span class="pun">.</span><span class="pln">was_published_recently</span><span class="pun">()</span></pre>

<p>
	افتح الآن صدفة بايثون جديدة، واستورد الأصناف Question و Choice بنفس الطريقة السابقة، ثم نفذ شيفرة الاستعلام عن جميع الأسئلة، ولاحظ الفرق.
</p>

<h3 id="طرق-الاستعلام-عن-البيانات-في-django">
	طرق الاستعلام عن البيانات في Django
</h3>

<p>
	لا شك أن التطبيقات على أرض الواقع تتضمن قواعد بيانات تحتوي على عدد هائل من البيانات والمعلومات، وهذا يتطلب وسيلة للاستعلام عنها حسب شرط معين، ويقدم Django طرقًا متعددة لإجراء استعلامات مخصصة وبأساليب مختلفة.
</p>

<p>
	يقدّم Django ثلاثة توابع خاصة بالصنف <code>QuerySet</code> هي: <code>filter()</code>, <code>exclude()</code>, <code>get()</code>، وجملة الاستعلام عبارة عن معاملات مفتاحية <code>Keyword arguments</code> لهذه التوابع، وتأخذ الصيغة التالية: الحقل__نوع الاستعلام = القيمة.
</p>

<p>
	يقوم كل تابع من هذه التوابع الثلاثة بإنشاء كائن جديد للصنف <code>QuerySet</code> يتضمن النتائج التي تم<br>
	الحصول عليها بعد إجراء الاستعلام.
</p>

<p>
	يقوم التابع <code>filter()</code> بإرجاع جميع العناصر المتوافقة مع الاستعلام، أما التابع <code>exclude()</code> فيرجع جميع العناصر غير المتوافقة مع الاستعلام، أما التابع <code>get()</code> فيرجع العنصر الذي يطابق جملة الاستعلام، وفي حالة العثور على أكثر من عنصر واحد يقوم هذا التابع بإطلاق الاستثناء <code>MultipleObjectsReturned</code> وإن لم يعثر على أي عنصر فسيطلق الاستثناء <code>DoesNotExist</code>.<br>
	إليك بعض الأمثلة التي توضح طريقة عمل هذه التوابع:
</p>

<p>
	يمكن البحث عن السؤال الذي يبدأ بعبارة معينة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_46"><span class="typ">Question</span><span class="pun">.</span><span class="pln">objects</span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">question_text__startswith</span><span class="pun">=</span><span class="str">'What'</span><span class="pun">)</span></pre>

<p>
	ستترجم هذه الشيفرة إلى عبارة SQL التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_49"><span class="pln">SELECT </span><span class="pun">…</span><span class="pln"> WHERE question_text LIKE </span><span class="pun">‘</span><span class="typ">What</span><span class="pun">%’;</span></pre>

<p>
	ويمكن البحث عن سؤال معين من خلال المعرّف الخاص به، فللبحث عن السؤال ذي المعرف رقم 1، يمكن كتابة الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_48"><span class="typ">Question</span><span class="pun">.</span><span class="pln">objects</span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">id</span><span class="pun">=</span><span class="lit">1</span><span class="pun">)</span></pre>

<p>
	والتي تعادل عبارة SQL التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_53"><span class="pln">SELECT </span><span class="pun">…</span><span class="pln"> WHERE id </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span></pre>

<p>
	مثال على التابع exclude():
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_50"><span class="typ">Question</span><span class="pun">.</span><span class="pln">objects</span><span class="pun">.</span><span class="pln">exclude</span><span class="pun">(</span><span class="pln">pub_date__gt</span><span class="pun">=</span><span class="pln">datetime</span><span class="pun">.</span><span class="pln">date</span><span class="pun">(</span><span class="lit">2016</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">),</span><span class="pln"> question_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">"What’s up?"</span><span class="pun">)</span></pre>

<p>
	تترجم هذه الشيفرة إلى عبارة SQL التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_57"><span class="pln">SELECT </span><span class="pun">…</span><span class="pln"> WHERE NOT </span><span class="pun">(</span><span class="pln">pub_date </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">‘</span><span class="lit">2016</span><span class="pun">-</span><span class="lit">1</span><span class="pun">-</span><span class="lit">3</span><span class="pun">’</span><span class="pln"> AND question_text </span><span class="pun">=</span><span class="pln"> </span><span class="pun">“</span><span class="typ">What</span><span class="pun">’</span><span class="pln">s up</span><span class="pun">?”)</span></pre>

<p>
	يوضح الجدول التالي بعض أنواع الاستعلامات التي يقدّمها Django:
</p>

<table>
	<tbody>
		<tr>
			<td>
				نوع الاستعلام
			</td>
			<td>
				الوظيفة
			</td>
		</tr>
		<tr>
			<td>
				exact
			</td>
			<td>
				تطابق تام.
			</td>
		</tr>
		<tr>
			<td>
				iexact
			</td>
			<td>
				تطابق تام مع تجاهل حالة الأحرف.
			</td>
		</tr>
		<tr>
			<td>
				contains
			</td>
			<td>
				البحث عن كلمة مع أخذ حالة الأحرف بنظر الاعتبار.
			</td>
		</tr>
		<tr>
			<td>
				icontains
			</td>
			<td>
				البحث عن كلمة مع تجاهل حالة الأحرف.
			</td>
		</tr>
		<tr>
			<td>
				in
			</td>
			<td>
				البحث ضمن قائمة معينة.
			</td>
		</tr>
		<tr>
			<td>
				gt
			</td>
			<td>
				أكبر من
			</td>
		</tr>
		<tr>
			<td>
				gte
			</td>
			<td>
				أكبر من أو يساوي
			</td>
		</tr>
		<tr>
			<td>
				lt
			</td>
			<td>
				أصغر من
			</td>
		</tr>
		<tr>
			<td>
				lte
			</td>
			<td>
				أصغر من أو يساوي
			</td>
		</tr>
		<tr>
			<td>
				startswith
			</td>
			<td>
				يبدأ بـ
			</td>
		</tr>
		<tr>
			<td>
				istartswith
			</td>
			<td>
				يبدأ بـ مع أخذ حالة الأحرف بنظر الاعتبار.
			</td>
		</tr>
		<tr>
			<td>
				endswith
			</td>
			<td>
				ينتهي بـ
			</td>
		</tr>
		<tr>
			<td>
				iendswith
			</td>
			<td>
				ينتهي بـ مع أخذ حالة الأحرف بنظر الاعتبار.
			</td>
		</tr>
		<tr>
			<td>
				range
			</td>
			<td>
				البحث ضمن مدى معين
			</td>
		</tr>
		<tr>
			<td>
				date
			</td>
			<td>
				البحث عن تاريخ معين
			</td>
		</tr>
		<tr>
			<td>
				year
			</td>
			<td>
				البحث عن سنة معينة
			</td>
		</tr>
		<tr>
			<td>
				month
			</td>
			<td>
				البحث عن شهر معين
			</td>
		</tr>
		<tr>
			<td>
				day
			</td>
			<td>
				البحث عن يوم معين
			</td>
		</tr>
		<tr>
			<td>
				week_day
			</td>
			<td>
				البحث عن أسماء أيام الأسبوع
			</td>
		</tr>
		<tr>
			<td>
				hour
			</td>
			<td>
				البحث عن ساعة
			</td>
		</tr>
		<tr>
			<td>
				minute
			</td>
			<td>
				البحث عن دقيقة
			</td>
		</tr>
		<tr>
			<td>
				second
			</td>
			<td>
				البحث عن ثانية
			</td>
		</tr>
	</tbody>
</table>

<p>
	لنستعلم الآن عن السؤال الذي يحمل المفتاح الرئيسي <code>primary key</code> رقم 1 في قاعدة البيانات الخاصة بنا، وإسناد النتيجة إلى متغير:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_52"><span class="pln">q </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Question</span><span class="pun">.</span><span class="pln">objects</span><span class="pun">.</span><span class="pln">get</span><span class="pun">(</span><span class="pln">pk</span><span class="pun">=</span><span class="lit">1</span><span class="pun">)</span></pre>

<p>
	يمكننا الآن الوصول إلى مجموعة الأجوبة <code>choice_set</code> والتي ينشئها Django تلقائيًا عند ربط الأسئلة بالأجوبة من خلال <code>ForeignKey</code>.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_56"><span class="pln">q</span><span class="pun">.</span><span class="pln">choice_set</span><span class="pun">.</span><span class="pln">all</span><span class="pun">()</span></pre>

<p>
	بطبيعة الحال، فإن مجموعة الأجوبة الخاصة بسؤالنا هذا فارغة، لذا سنقوم بإنشاء بعض الأجوبة وإضافتها إلى هذه المجموعة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_54"><span class="pln">q</span><span class="pun">.</span><span class="pln">choice_set</span><span class="pun">.</span><span class="pln">create</span><span class="pun">(</span><span class="pln">choice_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Not much'</span><span class="pun">,</span><span class="pln"> votes </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
q</span><span class="pun">.</span><span class="pln">choice_set</span><span class="pun">.</span><span class="pln">create</span><span class="pun">(</span><span class="pln">choice_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">'The sky'</span><span class="pun">,</span><span class="pln"> votes </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
c </span><span class="pun">=</span><span class="pln"> q</span><span class="pun">.</span><span class="pln">choice_set</span><span class="pun">.</span><span class="pln">create</span><span class="pun">(</span><span class="pln">choice_text </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Just hacking again'</span><span class="pun">,</span><span class="pln"> votes </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span></pre>

<p>
	والآن يمكن التعرف على السؤال المرتبط بالجواب:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_66"><span class="pln">c</span><span class="pun">.</span><span class="pln">question</span></pre>

<p>
	ويمكن معرفة عدد الأجوبة المتاحة لسؤال معين عن طريق التابع <code>count()</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_2613_58"><span class="pln">q</span><span class="pun">.</span><span class="pln">choice_set</span><span class="pun">.</span><span class="pln">count</span><span class="pun">()</span></pre>

<p>
	ويمكن حذف إجابة معينة عن طريق التابع <code>delete()</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4708_70"><span class="pln">c</span><span class="pun">.</span><span class="kwd">delete</span><span class="pun">()</span></pre>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	تعرفنا في هذا الدرس على العنصر الأول من عناصر إطار العمل Django ألا وهو النماذج Models، وتعرفنا كذلك على طريقة التعامل مع قواعد البيانات من خلال هذه النماذج وكيفية تهجيرها والاستعلام عن البيانات برمجيًا.
</p>

<p>
	أما الدرس القادم فسيكون عن المسارات URLS وآلية عملها، وكيفية استخدام التعابير النظامية Regular Expressions في إنشائها.
</p>

<p>
	المصدر:<br>
	<a href="https://docs.djangoproject.com/en/1.9" rel="external nofollow">توثيقات Django</a>.
</p>
]]></description><guid isPermaLink="false">405</guid><pubDate>Tue, 03 Jan 2017 09:10:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x62A;&#x637;&#x628;&#x64A;&#x642; &#x627;&#x644;&#x627;&#x642;&#x62A;&#x631;&#x627;&#x639;&#x627;&#x62A; &#x648;&#x643;&#x62A;&#x627;&#x628;&#x629; &#x627;&#x644;&#x639;&#x631;&#x636; &#x627;&#x644;&#x623;&#x648;&#x644; &#x639;&#x644;&#x649; Django</title><link>https://academy.hsoub.com/programming/python/django/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%A7%D9%84%D8%A7%D9%82%D8%AA%D8%B1%D8%A7%D8%B9%D8%A7%D8%AA-%D9%88%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D8%B9%D9%84%D9%89-django-r384/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_10/django-polls-app-first-view.png.41d4daf71044638826b21e1746a42968.png" /></p>

<p>
	بعد أن تعرفنا في الدرس الأول على <a href="https://academy.hsoub.com/programming/python/django/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-django%C2%A0-r353/" rel="">طريقة تثبيت Django وإنشاء مشروعنا الأول فيه</a>، سنشرع في هذا الدرس في إنشاء تطبيقنا الأول والذي سيكون عبارة عن موقع بسيط للاقتراعات يتكون من قسمين: 
</p>

<ul>
<li>
		القسم الأول: واجهة يمكن للمستخدم أن يطلع من خلالها على الأسئلة المطروحة واختيار الإجابة التي يرغب فيها. 
	</li>
	<li>
		أما القسم الثاني: لوحة تحكم يمكن من خلالها إضافة الأسئلة وتعديلها وحذفها وإضافة الأجوبة وغير ذلك من الأمور.
	</li>
</ul>
<p style="text-align: center;">
	<img alt="django-polls-app-first-view.png" class="ipsImage ipsImage_thumbnailed" data-fileid="19325" data-unique="50xs2y6vj" src="https://academy.hsoub.com/uploads/monthly_2016_10/django-polls-app-first-view.png.067f0b2706baa131a31db8a2c8efa999.png"></p>

<h2>
	المشاريع Projects والتطبيقات Applications
</h2>

<p>
	قبل أن ندخل في تفاصيل إنشاء تطبيق الاقتراعات، لا بأس في الحديث بشكل موجز عن مفهومي "المشروع" Project و"التّطبيق" Application في Django. 
</p>

<p>
	يمثّل المشروع تطبيق الويب الذي يتم إنشاؤه بواسطة Django، ويتم تعريفه من خلال ملف الإعدادات Settings، فكما رأينا في الدرس السابق فبعد تنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4472_8">
<span class="pln">django-admin startproject mysite</span></pre>

<p>
	تم إنشاء حزمة بايثون تحتوي على ملفات <span style="font-family:courier new,courier,monospace;">settings.py</span> و<span style="font-family:courier new,courier,monospace;"> urls.py</span> و <span style="font-family:courier new,courier,monospace;">wsgi.py</span>، وعادة ما تتوسع هذه الحزمة بإضافة المزيد من الملفات مثل ملفات CSS والقوالب وما إلى ذلك من الأمور التي لا تكون مرتبطة بتطبيق معيّن. 
</p>

<p>
	وعادة ما يكون مجلّد المشروع هذا (المجلد الذي يحتوي على الملف<span style="font-family:courier new,courier,monospace;"> manage.py</span>) حاويًا للتطبيقات التي يتم إنشاؤها بشكل مستقل، وهذه التطبيقات ما هي إلا حزم بايثون تعمل على تقديم بعض الخصائص وتؤدي بعض المهام، ويمكن استخدام هذه التطبيقات في مشاريع متعددة، وهذا ما يسمى بمبدأ قابلية إعادة الاستخدام re-usability.
</p>

<h2>
	إنشاء تطبيق الاقتراعات
</h2>

<p>
	<strong>ملاحظة</strong>: ابتدءًا من هذا الدرس فإن عبارة "مجلد المشروع" تعني المجلد الذي يحتوي على ملف <span style="font-family:courier new,courier,monospace;">manage.py</span>.
</p>

<p>
	توجّه في سطر الأوامر إلى مجلد المشروع ثم اكتب الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4472_10">
<span class="pln">python manage.py startapp polls</span></pre>

<p>
	يمكن الحصول على نفس النتيجة من خلال الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4472_12">
<span class="pln">django-admin startapp polls</span></pre>

<p>
	بعد تنفيذ الأمر ستجد أنّ إطار العمل قد أنشأ مجلدًا جديدًا يحمل الاسم <span style="font-family:courier new,courier,monospace;">polls</span>، ويتضمن عددًا من الملفات نستعرضها بشكل مختصر: 
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">init__.py__</span>: هذا الملف مشابه للملف الموجود في مجلد المشروع، وهو ملف فارغ يعني وجوده أن هذا المجلد هو حزمة من حزم بايثون. 
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">admin.py</span>: يمكن من خلال هذا الملف إدارة وتخصيص لوحة التحكم والتي تأتي جاهزة مع التطبيق.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">apps.py</span>: يمكن من خلال هذا الملف إعداد التطبيق configuration لاستخدامه في مشاريع أخرى.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">models.py</span>: سيتضمن هذا الملف النماذج التي يتعامل التطبيق معها، والتي تكون مسؤولة عن إنشاء جداول قواعد البيانات.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">tests.py</span>: يمكن من خلال هذا الملف إجراء الاختبارات Tests على التطبيق.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">views.py</span>: تضاف في هذا الملف العروض المسؤولة عن تحديد البيانات والمعلومات التي سيتم عرضها على المتصفح، وهي كذلك صلة الوصل بين المسارات والقوالب.
	</li>
	<li>
		مجلد <span style="font-family:courier new,courier,monospace;">migrations</span>: سيستقبل هذا المجلد الملفات الناشئة عن عملية تهجير قاعدة البيانات.
	</li>
</ul>
<h2>
	إعدادات المشروع
</h2>

<p>
	يحتوي مجلد المشروع على ملف الإعدادات <span style="font-family:courier new,courier,monospace;">settings.py</span>، وهو عبارة عن ملف بايثون يحتوي جميع الإعدادات الخاصة بالمشروع، وسنستعرض بعض محتويات هذا الملف بشكل موجز. 
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">BASE_DIR</span>: متغير نصّي يقدّم مسار المجلد الأساسي للمشروع، ويمكن الاستفادة من هذا المتغير في تحديد مسارات المجلدات التي تحتوي على القوالب أو الملفات الساكنة وغيرها، وسنتعرف على طريقة استخدامه عند الحديث عن القوالب.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">SECRET_KEY</span>: عبارة عن سلسلة نصية من حروف ورموز عشوائية يمكن الاستفادة منها في حماية التطبيق.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">DEBUG</span>: متغير من نوع <span style="font-family:courier new,courier,monospace;">bool</span>، ويمكن من خلاله التحكم في وضع التنقيح Debugging، حيث تظهر معلومات مفيدة عند حدوث الأخطاء، ولكن ينصح بتغيير قيمته إلى <span style="font-family:courier new,courier,monospace;">False</span> عند نقل المشروع إلى بيئة الإنتاج.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">INSTALLED_APPS</span>: عبارة عن قائمة تتضمن التطبيقات التي سيضمها المشروع الحالي، ويمكنك أن تلاحظ وجود عدد من التطبيقات المثبتة بشكل مسبق، مثل إدارة لوحة التحكم admin، والاستيثاق auth، والجلسات sessions وغيرها.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">TEMPLATES</span>: عبارة عن قائمة تتضمن إعدادات القوالب المستخدمة في المشروع، وما يهمنا فيها هو العنصر <span style="font-family:courier new,courier,monospace;">DIRS</span> والذي يتم من خلاله تعيين المسارات التي تحتوي على ملفات القالب.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">DATABASES</span>: قائمة أخرى مسؤولة عن تحديد المعلومات اللازمة للتعامل مع قواعد البيانات، وسنتطرق إليها عند الحديث عن النماذج Models والاتصال بقواعد البيانات.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">LANGUAGE_CODE</span>: يمكن من خلال هذا المتغير تحديد لغة واجهة لوحة التحكم، والإعداد الافتراضي هنا هو اللغة الإنكليزية، ولكن Django يدعم العديد من اللغات ومن ضمنها العربية، وإن كنت ترغب في استخدام اللغة العربية في عرض عناصر لوحة التحكم، فيمكنك تغيير قيمة هذا المتغير بالشكل التالي:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1329_7">
<span class="pln">LANGUAGE_CODE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'ar'</span></pre>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">TIME_ZONE</span>: يمكن من خلال هذا المتغيير تعيين المنطقة الزمنية التي سيستخدمها Django في دوال الوقت والتاريخ. ويمكن استبدال هذه القيمة حسب الرغبة.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">STATIC_URL</span>: في هذا المتغير يتم تحديد مسار المجلد الذي يحتوي على الملفات الساكنة وهي ملفات CSS و Javascript والخطوط والصور وغيرها.
	</li>
</ul>
<h2>
	كتابة العرض الأول
</h2>

<p>
	العرض View عبارة عن دالة مكتوبة بلغة Python (أو صنف كما سنرى في الدروس اللاحقة) يمكن تلخيص عملها ببساطة في أنها تأخذ الطلبات Requests التي يرسلها العميل وتقوم بإرجاع الإجابة response والتي يمكن أن تكون على هيئة شيفرة بصيغة HTML، أو إعادة توجيه لصفحة أخرى، أو صفحة خطأ 404، أو ملف XML، أو صورة أو أي شي آخر.
</p>

<p>
	لنبدأ الآن بكتابة العرض الأول في مشروعنا، وللقيام بذلك افتح ملف <span style="font-family:courier new,courier,monospace;">polls/view.s.py </span>في محرر النصوص المفضّل لديك، ثم امسح محتوياته واكتب الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1329_9">
<span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">http </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">HttpResponse</span><span class="pln"> 

</span><span class="kwd">def</span><span class="pln"> index</span><span class="pun">(</span><span class="pln">request</span><span class="pun">):</span><span class="pln">
    html </span><span class="pun">=</span><span class="pln"> </span><span class="str">"مرحبًا بك في تطبيق الاقتراعات، هذه هي الصفحة الرئيسية."</span><span class="pln"> 
    </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">HttpResponse</span><span class="pun">(</span><span class="pln">html</span><span class="pun">)</span></pre>

<p>
	في السطر الأول من هذه الشيفرة قمنا باستيراد الصنف <span style="font-family:courier new,courier,monospace;">HttpResponse</span> من وحدة<span style="font-family:courier new,courier,monospace;"> django.http</span>، وهو المسؤول عن التعامل مع الاستجابة التي ترد على الطلب الذي أرسلناه إلى الخادوم من خلال الدالة <span style="font-family:courier new,courier,monospace;">index</span>، وذلك عن طريق تمرير المعامل <span style="font-family:courier new,courier,monospace;">request</span> عند تعريف الدالة.
</p>

<p>
	ستقوم هذه الدالة بإعادة العنصر <span style="font-family:courier new,courier,monospace;">HttpResponse</span> والذي يحتوي على الإجابة، وهي في مثالنا هذا عبارة عن سلسلة نصية بسيطة.
</p>

<p>
	<strong>ملاحظة</strong>: في حال عدم ظهور الأحرف العربية بشكل صحيح، أضف السطر التالي إلى بداية ملف <span style="font-family:courier new,courier,monospace;">views.py</span>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1329_11">
<span class="com"># -*- coding:utf8 -*-</span></pre>

<p>
	لنتمكن من مشاهدة النتيجة على المتصفح، يجب أن نربط هذا العرض بمسار معين؛ وللقيام بذلك توجه إلى الملف <span style="font-family:courier new,courier,monospace;">mysite/urls.py</span> وعدّل محتوياته لتصبح بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1329_13">
<span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">conf</span><span class="pun">.</span><span class="pln">urls </span><span class="kwd">import</span><span class="pln"> url 
</span><span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">contrib </span><span class="kwd">import</span><span class="pln"> admin 
</span><span class="kwd">from</span><span class="pln"> polls </span><span class="kwd">import</span><span class="pln"> views 

urlpatterns </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> url</span><span class="pun">(</span><span class="pln">r</span><span class="str">'^admin/'</span><span class="pun">,</span><span class="pln"> admin</span><span class="pun">.</span><span class="pln">site</span><span class="pun">.</span><span class="pln">urls</span><span class="pun">),</span><span class="pln"> 
               url</span><span class="pun">(</span><span class="pln">r</span><span class="str">'^polls/'</span><span class="pun">,</span><span class="pln"> views</span><span class="pun">.</span><span class="pln">index</span><span class="pun">),</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	يتضمن هذا الملف جميع المسارات التي سنستخدمها في المشروع، وهو بمثابة جدول لمحتويات الموقع. 
</p>

<p>
	في البداية قمنا باستيراد محتويات ملف<span style="font-family:courier new,courier,monospace;"> views.py </span>الموجود في مجلد <span style="font-family:courier new,courier,monospace;">polls</span> من خلال الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1329_15">
<span class="kwd">from</span><span class="pln"> polls </span><span class="kwd">import</span><span class="pln"> views</span></pre>

<p>
	من خلال هذه الشيفرة يمكنك أن تلاحظ أن Django يتعامل مع المجلد <span style="font-family:courier new,courier,monospace;">polls</span> باعتباره حزمة من حزم بايثون، وذلك لاحتواءه على ملف<span style="font-family:courier new,courier,monospace;"> init__.py__</span> كما ذكرنا سابقًا. 
</p>

<p>
	بهذا الطريقة يمكننا الوصول إلى دالة <span style="font-family:courier new,courier,monospace;">index</span> التي أنشأناها قبل قليل في ملف <span style="font-family:courier new,courier,monospace;">views.py</span> الموجود في مجلد <span style="font-family:courier new,courier,monospace;">polls</span> (أو حزمة <span style="font-family:courier new,courier,monospace;">polls</span> لنكون أكثر دقة) وذلك تمهيدًا لربطها بالمسار الذي نرغب فيه. 
</p>

<p>
	أضفنا كذلك الشيفرة التالية إلى قائمة <span style="font-family:courier new,courier,monospace;">urlpatterns</span>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1329_17">
<span class="pln">url</span><span class="pun">(</span><span class="pln">r</span><span class="str">'/polls'</span><span class="pun">,</span><span class="pln"> views</span><span class="pun">.</span><span class="pln">index</span><span class="pun">),</span></pre>

<p>
	وهي عبارة عن دالة وظيفتها ربط المسار الذي نحدده في المعامل الأول بالعرض الذي نحدده في المعامل الثاني. 
</p>

<p>
	لاحظ أن المسار عبارة عن سلسلة نصية مسبوقة بحرف r صغير وذلك لإخبار بايثون بأن يتعامل مع هذه السلسلة النصية على أنّها سلسلة خام raw، بمعنى أنه سيتم تجاوز جميع العلامات الخاصة المستخدمة في هذه السلسلة، وهذا ضروري جدًّا، لأن Django يستخدم التعبيرات النظامية Regular Expressions في تحديد المسارات وتمرير المتغيرات، وهذه التعبيرات تستخدم الكثير من الرموز التي يجب تجاوزها لتعمل الشيفرة بالشكل الصحيح. 
</p>

<p>
	سنتعرف على المسارات وآلية عملها وكيفية استخدام التعبيرات النظامية، في الدروس اللاحقة.
</p>

<p>
	يمكنك الآن التوجه إلى مجلد المشروع وتشغيل الخادوم الخاص بـ Django عن طريق سطر الأوامر من خلال الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4472_30">
<span class="pln">python manage.py runserver</span></pre>

<p>
	انتقل في المتصفح إلى العنوان التالي:
</p>

<p style="text-align: center;">
	<a href="http://127.0.0.1:8000/polls%C2%A0" rel="external nofollow">http://127.0.0.1:8000/polls </a>
</p>

<p>
	لتشاهد عبارة الترحيب في واجهة الموقع. 
</p>

<p>
	يمكننا استخدام شيفرة HTML ضمن السلسلة النصية التي ترجعها دالة العرض، وللقيام بذلك افتح ملف <span style="font-family:courier new,courier,monospace;">polls/view.py</span> وعدّله ليصبح بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1329_20">
<span class="kwd">from</span><span class="pln"> django</span><span class="pun">.</span><span class="pln">http </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">HttpResponse</span><span class="pln"> 

</span><span class="kwd">def</span><span class="pln"> index</span><span class="pun">(</span><span class="pln">request</span><span class="pun">):</span><span class="pln"> 
  html </span><span class="pun">=</span><span class="pln"> </span><span class="str">""" 
        &lt;html dir="rtl"&gt;
         &lt;head&gt; 
            &lt;title&gt;تطبيق الاقتراعات&lt;/title&gt;
          &lt;/head&gt; 
          &lt;body&gt; 
            &lt;h1&gt;تطبيق الاقتراعات&lt;/h1&gt; 
            &lt;p&gt;مرحبًا بك في تطبيق الاقتراعات، هذه هي الصفحة الرئيسية.&lt;/p&gt; 
          &lt;/body&gt; 
        &lt;/html&gt; 
        """</span><span class="pln"> 
	</span><span class="kwd">return</span><span class="pln"> </span><span class="typ">HttpResponse</span><span class="pun">(</span><span class="pln">html</span><span class="pun">)</span></pre>

<p>
	من المؤكد أن التطبيقات التي نراها على صفحات الإنترنت لا تتمتع بهذه البساطة الشديدة، وهذا يعني أن استخدام شيفرة HTML ضمن دالة العرض أمر غير عملي على الإطلاق، وهنا تظهر الحاجة إلى فصل هذه الشيفرات عن العروض وهذه هي وظيفة القوالب Templates والتي سنتعرف إليها في الدروس اللاحقة.
</p>

<h2>
	خاتمة
</h2>

<p>
	تعرفنا في هذا الدرس على مفهومي المشروع والتطبيق في Django، وقمنا بكتابة العرض الأول وتعرفنا بشكل مختصر على المسارات Urls. 
</p>

<p>
	سنتعرف في الدرس القادم على كيفية التعامل مع قواعد البيانات من خلال النماذج Models، وكذلك سنتعرف على كيفية تهجير قواعد البيانات، وكذلك الاستعلام عن البيانات برمجيًا، وذلك لتهيئة قاعدة البيانات التي سنستخدمها في تطبيق الاقتراعات.
</p>
]]></description><guid isPermaLink="false">384</guid><pubDate>Sun, 09 Oct 2016 18:06:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x625;&#x637;&#x627;&#x631; &#x627;&#x644;&#x639;&#x645;&#x644; Django&#xA0;</title><link>https://academy.hsoub.com/programming/python/django/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-django%C2%A0-r353/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/django-101.png.a8a109de620a9c686c92cf87c511eb36.png" /></p>

<p>
	﻿Django هو إطار عمل مجّاني ومفتوح المصدر، مكتوب بلغة Python، وتتبع المشاريع فيه بنية Model-View-Template (عادة ما تختصر إلى MVT). يؤكّد Django على قابلية إعادة الاستخدام Reusability للمكونات وكذلك على التطوير السريع، بالإضافة إلى مبدأ عدم التكرار. 
</p>

<p>
	تستخدم لغة Python في جميع مفاصل إطار العمل هذا، كالإعدادات ونماذج قواعد البيانات وغيرها. 
</p>

<p>
	ومن أشهر المواقع التي تستخدم Django هي: Pinterest ،Instagram ،Mozilla ،The Washington Times ،Disqus ،National Geographic وغيرها الكثير. 
</p>

<p>
	طوّر Django سنة 2003 على يدي المبرمجين Adrian Holovaty و Simon Willson اللذين يعملان في صحيفة Lawrence Journal World، وذلك عندما انتقلا إلى لغة Python لبناء التطبيقات. ثم أطلق Django سنة 2005 تحت رخصة BSD، وقد سمّي بهذا الاسم تيمنًا بعازف الغيتار Django Reinhardt.
</p>

<p style="text-align: center;">
	<img alt="django-101.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17866" data-unique="5htepiyr2" src="https://academy.hsoub.com/uploads/monthly_2016_06/django-101.png.c855758ddbf37945f8f2738099610967.png"></p>

<h2>
	بنية MVT
</h2>

<p>
	تنقسم بنية المشاريع في Django إلى ثلاثة أقسام مرتبطة ببعضها البعض، ولكنّها مختلفة عن أطر العمل الأخرى التي تتبع بنية (MVC - Model, View, Controller) مثل <a href="https://academy.hsoub.com/programming/php/laravel/" rel="">Laravel</a> في PHP وغيرها، حيث تتكون المشاريع في Django من النموذج Model والعرض View والقالب Template. 
</p>

<ul>
<li>
		يتولى قسم النموذج معالجة البيانات والتعامل معها واسترجاعها، ويدعم Django العديد من قواعد البيانات، مثل: SQlite ،MySQL، و PostgreSQL. 
	</li>
	<li>
		أما العرض فعبارة عن مجموعة من دوال Python التي تستجيب لعنوان URL معين، ووظيفة العرض هي تحديد البيانات والمعلومات التي يجب عرضها. 
	</li>
	<li>
		أما القالب فهو عبارة عن ملف بصيغة HTML يتم من خلاله تحديد الطريقة التي ستظهر بها المعلومات التي يعرضها قسم العرض. 
	</li>
</ul>
<p>
	أين المتحكم Controller إذًا؟ المتحكم هنا هو إطار العمل نفسه، أي الآلية التي يتم من خلالها إرسال الطلب إلى العرض المناسب بالاعتماد على عنوان URL محدّد.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17987" href="https://academy.hsoub.com/uploads/monthly_2016_06/MVT.png.e98491009c578f0f81d3fb4df78ed214.png" rel="external"><img alt="MVT.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17987" data-unique="r247i7egf" src="https://academy.hsoub.com/uploads/monthly_2016_06/MVT.thumb.png.106e4a669cfdf5568a8ffd7f5319214d.png"></a>
</p>

<h2>
	تثبيت Django
</h2>

<p>
	إطار العمل Django هو إحدى الحزم الخاصة بلغة البرمجة بايثون، وتوفّر هذه اللغة مدير حزم خاصّ يدعى <span style="font-family:courier new,courier,monospace;">pip</span> يتم من خلاله تثبيت وتحديث وإزالة الحزم بسهولة ويسر؛ لذا ستكون الخطوة الأولى في تثبيت Django هي التأكد من وجود مدير الحزم <span style="font-family:courier new,courier,monospace;">pip</span> وتثبيته إن لم يكن متوفّرًا.
</p>

<h3>
	تنصيب pip
</h3>

<p>
	لتنصيب إطار العمل Django ستحتاج إلى مدير الحزم الخاصّ بـ Python وهو <span style="font-family:courier new,courier,monospace;">pip</span>، ولحسن الحظّ فإن <span style="font-family:courier new,courier,monospace;">pip</span> متوفّر في نسخة Python 2.7.9 وما بعدها، وفي نسخة Python 3.4 وما بعدها. 
</p>

<p>
	في حال عدم توفّر <span style="font-family:courier new,courier,monospace;">pip</span> في نسخة Python المنصّبة لديك يمكنك تنصيبه باتباع الخطوات التالية: 
</p>

<ol>
<li>
		حمّل الملفّ <a class="ipsAttachLink" data-fileid="17864" href="//academy.hsoub.com/applications/core/interface/file/attachment.php?id=17864" rel="">get-pip.py</a>.
	</li>
	<li>
		توجه في سطر الأوامر إلى المكان الذي حملت فيه الملف السابق، ثم اكتب التعليمة التالية:
	</li>
</ol>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_8">
<span class="pln">python get-pip.py</span></pre>

<h3>
	استخدام سطر الأوامر
</h3>

<p>
	لنجرب الآن استخدام مدير الحزم في بايثون لتنصيب Django، توجّه الآن إلى سطر الأوامر ثم اكتب الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_10">
<span class="pln">pip install django==1.9
</span></pre>

<p>
	هل ظهرت لك رسالة خطأ؟ ما المشكلة، ألم نقم بتنصيب <span style="font-family:courier new,courier,monospace;">pip</span> قبل قليل؟ 
</p>

<p>
	هذا صحيح، ولكننا لم نخبر سطر الأوامر بأن يوجّه أي تعليمة تبدأ بكلمة <span style="font-family:courier new,courier,monospace;">pip</span> إلى مدير حزم بايثون، وللقيام بذلك اتبع الخطوات التالية:
</p>

<ul>
<li>
		في أوبنتو:
	</li>
</ul>
<p>
	يجب تنصيب حزمة<span style="font-family:courier new,courier,monospace;"> python3-pip</span> إن كنت تستخدم الإصدار الثالث من بايثون أو<span style="font-family:courier new,courier,monospace;"> python-pip</span> للإصدار الثاني من بايثون، لتتمكن من استخدام <span style="font-family:courier new,courier,monospace;">pip</span> في سطر الأوامر في أبونتو، وللقيام بذلك اكتب الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_21">
<span class="pln">sudo apt-get install python3-pip</span></pre>

<p>
	أدخل كلمة المرور الخاصة بك، وستبدأ عملية التثبيت، وبعد الانتهاء يمكنك تنصيب أي حزمة خاصة بلغة بايثون عن طريق سطر الأوامر مباشرة.
</p>

<ul>
<li>
		في نظام Windows:
	</li>
</ul>
<p>
	أما في نظام Windows فيجب إضافة السطر التالي: 
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_23">
<span class="pln">C:\Python34\scripts; </span></pre>

<p>
	إلى مسار النظام System path، وللقيام بذلك اتبع الخطوات التالية: 
</p>

<ol>
<li>
		انقر بزر الفأرة الأيمن على أيقونة <strong>Computer</strong> واختر <strong>Properties</strong> من القائمة المنسدلة:
	</li>
	<li>
		انقر على أيقونة <strong>Advance system settings</strong>، وفي مربع الحوار المنبثق اضغط على أيقونة <strong>Environment Variables</strong>.
	</li>
	<li>
		انقر نقراً مزدوجًا على متغير النظام Path في الجزء السفلي من مربع الحوار المنبثق.
	</li>
	<li>
		أضف السطر السابق إلى نهاية السلسلة النصّية، بعد الفاصلة المنقوطة (;) (إن لم تكن هناك فاصلة منقوطة في نهاية السطر فقم بإضافتها).
	</li>
	<li>
		اضغط <strong>Ok</strong> ثم أغلق بقية النوافذ بالضغط على <strong>Ok</strong>. 
	</li>
</ol>
<p>
	يمكنك الآن استخدام <span style="font-family:courier new,courier,monospace;">pip</span> من سطر الأوامر مباشرة.
</p>

<h3>
	البيئة الافتراضية Virtual Environment
</h3>

<p>
	قبل البدء بتنصيب Django سنعمل على تنصيب أداة مفيدة جدًّا من شأنها المساعدة على ترتيب البيئة البرمجية على حاسوبك. يمكن تجاوز هذه الخطوة، ولكن ينصح بها بشدّة. 
</p>

<p>
	تعمل البيئة الافتراضية على عزل مشاريع Python أو Django الخاصّة بك عن بعضها البعض، وهذا يعني أن إجراء التعديلات على موقع إلكتروني معيّن لن تؤثّر على المشاريع الأخرى التي تعمل عليها. 
</p>

<p>
	ستحتوي البيئة الافتراضية على الملفات التنفيذية الخاصة بـ Python بالإضافة إلى نسخة من مكتبة <span style="font-family:courier new,courier,monospace;">pip</span> يمكنك استخدامها في تنصيب حزم Python المختلفة. 
</p>

<p>
	سننشئ مجلدًا سيحتوي على البيئة الافتراضية التي سوف ننشئها بعد قليل.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_41">
<span class="pln">mkdir mysite
cd mysite</span></pre>

<p>
	يتطلب إنشاء البيئة الافتراضية تنصيب حزمة <span style="font-family:courier new,courier,monospace;">virtualenv</span> وسنستعين بـ <span style="font-family:courier new,courier,monospace;">pip</span> للقيام بذلك:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_27">
<span class="pln">pip install virtualenv</span></pre>

<p>
	لاستخدام <span style="font-family:courier new,courier,monospace;">virtualenv</span> من سطر الأوامر مباشرة في أوبنتو يجب تنصيب الحزمة <span style="font-family:courier new,courier,monospace;">virtualenv</span>، وللقيام بذلك اكتب الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_29">
<span class="pln">sudo apt-get install virtualenv</span></pre>

<p>
	بعد اكتمال عملية التنصيب يمكنك إنشاء البيئة الافتراضية بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_31">
<span class="pln">virtualenv myvenv</span></pre>

<p>
	ستنشئ هذه الشيفرة بيئة افتراضية وهي عبارة عن مجموعة من المجلدات. 
</p>

<p>
	لتفعيل البيئة الافتراضية الجديدة في نظام Windows استخدم الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_33">
<span class="pln">myvenv\Scripts\activate</span></pre>

<p>
	أما في نظامي Linux و OS X فاستخدم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_35">
<span class="pln">source myvenv/bin/activate</span></pre>

<p>
	<strong>ملاحظة</strong>: قد لا تحصل على النتيجة المرجوّة من الشيفرة السابقة، لذا يمكنك استخدام هذه الشيفرة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_37">
<span class="pln">. myvenv/bin/activate</span></pre>

<p>
	سيتغيّر سطر الأوامر وذلك بإضافة كلمة (myvenv) إلى بداية السطر، وهذا يعني أن الأمور تسير على ما يرام. 
</p>

<p>
	ولإغلاق البيئة الافتراضية يمكنك استخدام التعليمة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_39">
<span class="pln">deactivate</span></pre>

<h3>
	تنصيب Django
</h3>

<p>
	بعد اكتمال الخطوتين السابقتين يمكننا الآن تنصيب Django وذلك بتنفيذ الأمر التالي (انتبه إلى وجود علامتي مساواة لا علامة واحدة):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_43">
<span class="pln">pip install django==1.9</span></pre>

<p>
	بعد اكتمال عملية التنصيب، وللتأكد من أن الأمور تجري على ما يرام، اكتب الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_45">
<span class="pln">python3 -c "import django; print(django.get_version())"</span></pre>

<p>
	إن حصلت على رقم النسخة (1.9 في حالتنا هذه) التي قمت بتنصيبها، فقد أصبحت جاهزًا لإنشاء مشروعك الأول على Django.
</p>

<h2>
	إنشاء المشروع الأول
</h2>

<p>
	مشروعنا الأول سيكون عبارة عن تطبيق استطلاع بسيط، يتألف من جزئين: 
</p>

<ol>
<li>
		موقع عام يتيح مشاهدة الاستطلاعات والتصويت عليها. 
	</li>
	<li>
		لوحة تحكم تتيح لنا إضافة وحذف وتعديل الاستطلاعات. 
	</li>
</ol>
<p>
	هذا المشروع سيكون مبنيًا على الإصدار 1.9 من Django والإصدار 3.4 من Python. في حال كنت تستخدم الإصدار 2.7 من Python فيتوجب عليك حينها إضافة بعض التعديلات على الشيفرة التي تكتبها، وسنشير إلى ذلك في محلّه. 
</p>

<p>
	انتقل إلى سطر الأوامر وتوجه من خلاله إلى المجلد الذي ترغب استخدامه لإنشاء المشروع، وبإمكانك استخدام أي مجلد تحت أي تسمية وفي أي موقع في القرص الصلب، فلا مشكلة لدى Django في ذلك. 
</p>

<p>
	لإنشاء المشروع نفّذ الأمر التّالي في سطر الأوامر (انتبه إلى النقطة في نهاية السطر):
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_12">
<span class="pln">django-admin startproject mysite .</span></pre>

<p>
	سيعمل هذا الأمر على إنشاء مجلد باسم <span style="font-family:courier new,courier,monospace;">mysite</span> داخل مجلد المشروع. 
</p>

<p>
	انتبه كذلك إلى كتابة النقطة في نهاية السطر، فهي توجّه الشيفرة إلى تنصيب Django في المجلد الحالي.
</p>

<h3>
	البنية الأولية للمشروع
</h3>

<p>
	يحتوي مجلد <span style="font-family:courier new,courier,monospace;">mysite</span> الذي أنشأته التعليمة السابقة، على مجموعة الملفات التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_14">
<span class="pln">manage.py
/mysite
	__init__.py
	settings.py
	urls.py
	wsgi.py</span></pre>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">manage.py</span>، يُوصف هذا الملف بالسكين السويسري، وهو الأداة التي سنستعين بها للقيام بالكثير من الأشياء في إدارة الموقع، وفي تهجير قواعد البيانات وتشغيل الخادوم الخاص بـ Django، وغير ذلك الكثير.
	</li>
	<li>
		المجلد <span style="font-family:courier new,courier,monospace;">mysite</span> هو حزمة بايثون الخاصة بمشروعنا، وسنستخدم هذا الاسم عندما نرغب في استيراد أي شيء داخله. (مثال<span style="font-family:courier new,courier,monospace;"> mysite.urls</span>).
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">mysite/__init__.py</span> ملف فارغ، ووجوده يعني أن هذا المجلّد هو حزمة من حزم بايثون.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">mysite/settings.py</span> ملف الإعدادات الخاصة بمشروعنا.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">mysite/urls.py</span> يحتوي على عناوين URL الخاصة بموقعنا، وهو أشبه ما يكون بجدول المحتويات الخاص بالموقع.
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">mysite/wsgi.py</span> نقطة الولوج إلى الخواديم المتوافقة مع WSGI.
	</li>
</ul>
<h3>
	تشغيل الخادوم
</h3>

<p>
	توجه في سطر الأوامر إلى المجلد الذي يحوي الملف <span style="font-family:courier new,courier,monospace;">manage.py </span>ثم اكتب الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_16">
<span class="pln">python manage.py runserver</span></pre>

<p>
	وستظهر العبارات التالية في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_9700_18">
<span class="pln">Performing system checks...

System check identified no issues (0 silenced).

You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.

February 01, 2016 - 15:50:53
Django version 1.9, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.</span></pre>

<p>
	<strong>ملاحظة</strong>: لا تستخدم هذا الخادوم في المشاريع الإنتاجية على الإطلاق، فالهدف من هذا الخادوم هو استخدامه لأغراض التطوير فقط. 
</p>

<p>
	أدخل العنوان التالي في متصفح الإنترنت:
</p>

<p style="text-align: center;">
	<a href="http://127.0.0.1:8000" rel="external nofollow">http://127.0.0.1:8000</a>
</p>

<p>
	ستظهر الصفحة التالية لتشير إلى نجاحنا في إنشاء أول مشروع في Django.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17986" href="https://academy.hsoub.com/uploads/monthly_2016_06/django-server.jpg.1a5b510719eb25319fd750585b051766.jpg" rel="external"><img alt="django-server.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="17986" data-unique="9nx5txfi4" src="https://academy.hsoub.com/uploads/monthly_2016_06/django-server.thumb.jpg.fd3c565b9f236bf3d331909880de434a.jpg"></a>
</p>
]]></description><guid isPermaLink="false">353</guid><pubDate>Fri, 17 Jun 2016 08:25:00 +0000</pubDate></item></channel></rss>
