English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دخول سريع Django - عرض

الوظيفة هي نوع صفحة ويب في تطبيق Django، وتقدم وظائف معينة وتملك قوالب معينة. على سبيل المثال، في تطبيق قسم المدونة، قد تكون هناك بعض الوظائف التالية:

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

في تطبيقنا polls، هناك أربع وظائف هي:

صفحة الفهرس الخاصة بالسؤال - عرض الأسئلة الأخيرة. صفحة التفاصيل الخاصة بالسؤال - عرض نص السؤال دون نتائج لكن مع استمارة للتصويت. صفحة النتائج الخاصة بالسؤال - عرض النتائج الخاصة بسؤال معين. عمليات التصويت - معالجة التصويت لاختيار معين في سؤال معين.

في Django، يقدم المحتوى على صفحات الويب والآخرين من خلال الوظائف. كل وظيفة تمثل بواسطة دالة بسيطة من Python (أو طريقة، بناءً على الوظيفة القائمة على الصفحة). سيزيد Django من اختيار الوظيفة من خلال النظر في جزء الـ URL الذي يلي النطاق المفضل لطلب URL (بالدقة، الجزء الذي يلي النطاق).

نمط URL هو شكل عام بسيط لـ URL - على سبيل المثال: /newsarchive/<السنة>/<الشهر>/.

كتابة المزيد من الوظائف

الآن، دعونا نضيف بعض الوظائف في polls/views.py. هذه الوظائف مختلفة قليلاً، لأنها تحتاج إلى معامل:

def detail(request, question_id):
    تعود HttpResponse("كنت تبحث عن السؤال %s." % معرف_السؤال)
def نتائج(طلب, معرف_السؤال):
    response = "You're looking at the results of question %s."
    return HttpResponse(response % question_id)
def vote(request, question_id):
    return HttpResponse("You're voting on question %s." % question_id)

تم إضافة هذه النظارات الجديدة إلى ملف polls.urls كنداء url() التالي، والذي هو ملف polls/urls.py كما يلي:

من   django.conf.urls   استورد الـ url
from . import views
urlpatterns = [
 # مثال: /polls/
    url(r'^$', views.index, name='index'),
 # مثال: /polls/5/
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
 # مثال: /polls/5/results/
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
 # مثال: /polls/5/vote/
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

يمكنك فتح "polls/34/" في المتصفح. سيقوم بتشغيل دالة detail() وعرض أي محتوى URL تم توفيره. مجدداً محاولة الوصول إلى "polls/34/results/" و "polls/34/vote/" – سيتم عرض النتائج المعدة والصفحة للتصويت.

يمكن استخدام include() بسهولة لضم الإضافات والمسارات. لأن polls هي في إعدادات URL الخاصة بها (polls/urls.py)، يمكن وضعها في "polls/" أو "fun_polls/" أو "content/polls/" أو أي مسار جذري آخر، والبرنامج يمكنه العمل.

إليك ما سيحدث إذا كان المستخدم يدخل "polls/34/" في النظام:

سيجد Django التطابق '^polls/' ثم، سيزيل Django النص المتناسب ("polls/")

ويتم إرسال النص المتبقي – "34/" – إلى إعدادات URL 'polls.urls' لمعالجة التطابق المكتشف لاحقاً بتنسيق r'^(?P<question_id>[0-9]+)/$' للإشارة إلى دالة detail() كما هو موضح أدناه:

detail(request=<HttpRequest object>, question_id='34')

question_id='34' هو جزء من (?P<question_id>[0-9]+)، يستخدم حاوية النمط المحيطة "التقاطع" لتنسيق النص النمطي، ويتم نقل النص النمطي كمعامل إلى دالة الوظيفة؛ ?P<question_id> يعرف الاسم الذي سيتم استخدامه لتحديد النمط المتناسب؛ وأيضاً [0-9]+ هو تعبير نمطي لتنسيق سلسلة من الأرقام (رقم واحد).

بما أن نموذج URL هو تعبير تقني، يمكن استخدامه للقيام ببعض الأمور، بدون أي قيود. كما أن هناك لا حاجة لضيف URL .html - إلا إذا كنت ترغب في ذلك، في هذه الحالة يمكنك القيام بذلك:}}

url(r'^polls/latest\.html$', views.index),

كتابة عرض لتحقيق الوظيفة

كل عرض مسؤول عن إحدى المهمتين التاليتين: عودةHttpResponse يحتوي على محتوى الصفحة المطلوب، أو رمي استثناء، مثلHTTP 404. قم بتعديل شفرة ملف polls/views.py كما يلي:

من django.http وارد استجابة
from models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    output = ','.join([q.question_text for q in latest_question_list])
    عدّل استجابة(output)
# ابقِ الباقي من العروض (التفاصيل، النتائج، الصوت) على حاله

هناك سؤال واحد هنا، من خلال: التصميم الورقي موصوف بشكل صلب في العرض. إذا كنت ترغب في تغيير شكل الصفحة، يجب تعديل هذا الشفرة Python. لذا دعونا نستخدم نظام النماذج Django من خلال إنشاء عرض يمكنه استخدام النموذج لفصل شفرة Python. polls/templates/polls/index.html الشفرة التالية:

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="/polls/{{ question.id }}/">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>لا توجد استطلاعات الرأي متاحة.</p>
{% endif %}

الآن دعونا نحدث تحديثًا على عرض الصفحة الرئيسية polls/views.py باستخدام النموذج التالي (الشفرة):

من django.http وارد استجابة
من django.template وارد محمي_النصوص
from models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    نموذج = محمي_النصوص.الحصول_على_النموذج('polls/index.html')
    سياق = {
        'آخر_الأسئلة_السائلة': آخر_الأسئلة_السائلة,
    }
    return HttpResponse(template.render(context, request))

يحمل هذا الكود نمط polls/index.html، ثم يمر به إلى سياقه. السياق هو دictionاري يحل محل أسماء متغيرات النمط بمساهمة Python.

طريقة مختصرة: render()

هذا استخدام عادة لتحميل النمط، ملء السياق وتقديم نتيجة عرض النمط بعودة HttpResponse الهدف. يقدم Django طريقة مختصرة. إليك عرض index() الكامل، قم بتغيير polls/views.py كالتالي:

من django.shortcuts استيراد render
from models import Question
def index(request):
    latest_question_list = Question.objects.order_by('-pub_date')[:5]
    context = {'latest_question_list': latest_question_list}
    return render(request, 'polls/index.html', context)

لاحظ أننا، عند القيام بذلك في جميع الرؤى، لم نعد بحاجة إلى استيراد محمل HttpResponse الهدف (إذا كنت ترغب في الحفاظ على HttpResponse، إذا كانت هناك طريقة مختصرة للـ detail، results، و vote).

تحفيز خطأ 404

الآن، دعونا نحل هذه المشكلة في عرض التفاصيل - عرض صفحة النصوص للسؤال الاستطلاعي المحدد. هنا يتم إضافة رمز الرؤية (polls/views.py):

من django.http استيراد Http404
من django.shortcuts استيراد render
from models import Question
# ...
def detail(request, question_id):
    try:
        question = Question.objects.get(pk=question_id)
    except Question.DoesNotExist:
        raise Http404("لا يوجد سؤال موجود")
    return render(request, 'polls/detail.html', {'question': question})

لاحظ هنا: يمكن أن يسبب الرؤية HTTP404 استثناء، حتى لو لم يكن هناك مشكلة في معرف الطلب.

سنناقش إجراء بعض التغييرات في polls/detail.html فيما بعد، ولكن إذا كنت ترغب في استخدام المثال السابق بسرعة، ملف polls/templates/polls/detail.html يجب أن يحتوي فقط على:


   {{question}}


إذا كانت هناك مشكلة في عدم وجود 404، فنحن نطلب مشكلة غير موجودة، مثل: http://127.0.0.1:8000/polls/100/، والنتيجة ستكون كالتالي:

طريقة مختصرة: get_object_or_404()

استخدام get() ورفع خطأ HTTP404 هو طريقة شائعة جدًا. يقدم Django طريقًا مختصرًا. إليك عرض detail() في polls/views.py بعد التعديل:

from django.shortcuts import get_object_or_404, render
from models import Question
# ...
def detail(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    return render(request, 'polls/detail.html', {'question': question})

تقبل دالة get_object_or_404() كائن Django كأول متغير وعدد غير محدود من المعلمات الكلمات المفتاحية، ويقوم بتقديمها إلى دالة get() في إدارة النموذج.

إذا لم يكن الكائن موجودًا، فإنه يسبب HTTP404.

هناك أيضًا دالة get_list_or_404()، التي تعمل بنفس طريقة get_object_or_404() - باستخدام filter() بدلاً من طريقة get(). إذا كانت القائمة فارغة، فإنها تسبب HTTP404.

استخدام نظام النماذج

نعود إلى تطبيقنا polls وعرض detail() الخاص بنا. بسبب مشكلة المتغيرات الظاهرية، يبدو نموذج polls/detail.html كالتالي:

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>


نظام النماذج يستخدم لغة الاستعلام النقاط لاستدعاء خصائص المتغيرات. في هذا المثال {{question.question_text }}، الأول Django بالفعل يبحث في قاموس الكائن question. إذا لم يجد، يحاول استدعاء الخاصية – إذا فشل استدعاء الخاصية، يحاول استدعاء فهرس القائمة.
الآن قم باختبار الكود الذي كتبناه أعلاه، افتح المتصفح وأدخل: http://127.0.0.1:8000/polls/5/ للحصول على النتيجة التالية:

إزالة عنوان الويب المحكوم به في النمذجة

تذكر، عندما نصل إلى سؤال في polls/index.html، يكون الجزء المحكوم بالقوة من الرابط مثل هذا:

  <li><a href="/polls/{{question.id}}/">{{question.question_text}}</a></li>

مشكلة هذا الأسلوب هو أنه يعتمد بشكل تام على النمذجة عند تغيير مسارات المشروع. ومع ذلك، لأن ملف polls.urls يحدد اسم المعامل url()، يمكنك استخدام وسم النمذجة {% url %} لفصل التبعية لـ URL المحدد في تكوين URL:

  <li><a href="{etail'question.id%}">{{question.question_text}}</a></li>

يتم هذا العمل من خلال تعريف المسار الذي يتم البحث عنه في ملف polls.urls. يمكنك رؤية تعريف اسم المسار 'detail' كما يلي:

  ...
# القيمة المطلوبة 'name' من قبل وسم النمذجة {% url %}
url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
...

إذا كنت ترغب في تغيير مسار عرض التفاصيل للتصويت إلى آخر، مثل polls/specifics/12/، يجب تغييره في polls/urls.py إذا كنت تستخدمه في النمذجة (أو templates):

  ...
# تم إضافة كلمة 'specifics'
url(r'^specifics/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
...

اسم المسار الاسمي

مشروع هذا الدليل يحتوي على تطبيق واحد فقط - polls. في مشروع Django الحقيقي، قد يكون هناك خمس، عشرة، عشرون أو أكثر من التطبيقات. كيف يمكن لـ Django التمييز بين مساراتها؟ على سبيل المثال، تطبيق الاستطلاعات يحتوي على عرض تفصيلي، لذا قد يكون هناك نفس التطبيق في مشروع بلوق في نفس المشروع. كيف يمكن استخدام وسم النمذجة {% url %} لتحديد Django أن هناك تطبيقًا به عرض بهذا الاسم؟

الإجابة هي إضافة المساحة الاسمية إلى URLconf. في ملف polls/urls.py، استمر في التقدم، أضف إعدادات اسم التطبيق وإعداد المساحة الاسمية للتطبيق، افتح ملف polls/urls.py:

من   django.conf.urls   استورد الـ url
from . import views
app_name = 'polls'
urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    url(r'^(?P<question_id>[0-9]+)/results/$', views.results, name='results'),
    url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
]

الآن قم بتعديل نموذج polls/index.html، افتح ملف polls/templates/polls/index.html وأضف الكود التالي:

  <li><a href="{etail'question.id%}">{{question.question_text}}</a></li>

اجعلها تشير إلى عرض detail في المساحة الاسمية detail، افتح ملف polls/templates/polls/index.html كما يلي:

  <li><a href="{olls:detail'question.id%}">{{question.question_text}}</a></li>