جانغو أصابني بالجنون!

  • ahmed.alhaj

اليوم و بينما كنت أطوّر مشروعي على إطار العمل "جانغو"، لاحظت رسالة تحذير من خادم التطوير يخبرني فيها أنني استخدم عبارة RegEx خاطئة و طلب مني تغييرها، و لأنني لا أملك تلك الخبرة في RegEx، قمتُ بتغييرها كما طلب مني.

كما تعلمون فإن النمط أدناه من المفترض أن يطابق الصفحة الرئيسية للموقع، أي بدون إدراج شيء بعد نطاق الموقع

 url(r'^$', views.home)

إلّا أن حضرة السيد جانغو طلب تغييرها بحذف علامة الدولار. الشيء الذي سيجعل جميع الروابط تحول المستخدم للصفحة الرئيسية حتى لو لم يطلبها!!

أُصِبتُ حينها بالجنون و لم أعلم في ماذا أخطأت، قمت بتعديل الـViews و كتابتها من الصفر، كما أعدت ترتيب الـTemplate و لكن شيئاً لم ينفع. حتى حاولت صدفة إرجاع المشروع إلى آخر لقطة كان يعمل فيها بدون مشاكل، و اكتشفت أن الخطأ كان تطبيق كلام حضرة السيد جانغو!

و اتضح في النهاية أن الحل هو كتابة التعبير هكذا مع وضعه في آخر القائمة:

url(r'^', include(home.urls)),
يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

حسب الشيفرة المصدرية لجانغو[1]، يبدو بأنّ رسالة الخطأ تحدث إذا ما استعملت الدّالة include عند إنشاء موجّه.

هل أنت متاكد من أنّك لم تستخدم الدّالة include؟

واعذرني إن أخطأت في فهم المُشكلة، إذ لا أعمل مع جانغو وخبرتي به شبه معدومة :)

[1]

نعم استخدمتها لتتوجه إلى تطبيق 'home' الذي أنشأته خصيصا ليتعامل مع الرابط example.com و الذي يقابل التعبير r'^$' أليس كذلك؟()

بالمناسبة جميع ما سبق كان في ملف urls الأب - الذي يوجد في ال package ولا يتبع لأي تطبيق

عبد الهادي أضف ردا

هكذا إذن،

حسب التّوثيق الرّسمي[1] لا يجب عليك استخدام علامة الدولار إذا كنت تستعمل الدالة include.

هذا مُقتطف من التّوثيق:

Note that the regular expressions in this example don’t have a $ (end-of-string match character) but do include a trailing slash.
Whenever Django encounters include() (django.conf.urls.include()),
 it chops off whatever part of the URL matched up to that point and sends the remaining string to the included URLconf for further processing.

[1]

المشكلة أن هذا سيؤدي لتعطيل جميع الروابط الأخرى، عندي ثلاثة url maps و جميعهم يحولوني إلى ال view الخاصة بتطبيق home لأن أي نمط سيطابق ^

لو كانت هناك خاصية super-seed، مثل تلك التي في css، لما كانت مشكلة

أمر غريب، يبدو بأنّك لم تكتب الموجّه بشكل صحيح.

أعتقد بأنّه يجب أن يكون كالتّالي:

url(r'^/', include('views.home'))

لاحظ علامة / في الأخير.

فعلاً هو لا يريد السلاش في الأخير أيضاً، عموماً اتضح أن الحل هو كتابتها كما قال العم جانغو مع وضع الموجه في آخر القائمة.

أظن أنه منعني حتى من كتابة السلاش، سأتأكد عندما أعود للمنزل

لحظة، دالة include أنا استخدمتها لجلب ملف الurls و ليس ال views، هل بإمكانك استخدامه مع الviews أيضا؟

لا أعلم، أظنّ بأنّني أخطأت :)

بالمُناسبة عد إلى التّوثيق الرّسمي فهو خير صديق :)

بالفعل ،شكرا جزيلا على ردك. صدعت رأسك بهذا الجانغو :p

هل يمكنك إرفاق ملف urls.py؟

إن كنت تبحث عن السطر الذي سبب المشكلة فهو السطر البرمجي الذي ذكرته في الموضوع، و هو من ملف urls.py

afaki أضف ردا

لا ابحث عن هذا السطر بل ابحث عن شئ اخر.

أنا خارج المنزل الآن، سأرفقه عندما أرجع

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^distro/', include('distro.urls')),
    url(r'^$', include('home.urls')),

]

هل هذه هي الشيفرة بعد إصلاح الخطأ؟ إذا لم تكن كذلك هلّا طرحت الشيفرة الصحيحة؟

هذه هي

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^distro/', include('distro.urls')),
    url(r'^', include('home.urls')),

]

جيد أنك وفقت في إيجاد الحل الأن حاول أن تغير عنوان الموضوع بما يتناسب مع المشكلة حتى يسهل على الباحثين عليها فيما بعد

للتوضيح فقط، وليكون الحل جاهزًا لمن يطلع على الموضوع مستقبلًا:

الحلّ هو في كتابة عبارة url بالصيغة التالية:

url(r'^/', include('views.home'))

أي استبدال علامة $ بـ علامة /.

في الواقع، هذا ليس حلاً، لأن جانغو يتذمر بشأن الـ(/) أيضاً و يطلب حذفها. عموماً وجدت أن الحل هو كتابتها كما أرادها جانغو و لكن مع وضعها في آخر القائمة.

وقعت في نفس المشكلة ولكن لم ينفع الحل

علما اني قمت بتحديث الدجانغو لااخر اصدار والمشكلة ظهرت بحيث يرفض ان يتم تشغيل السيرفر

ويخبرني ان الخطا موجود بالتوجية وبالضبط عند التعابير القياسية

هل التحديث الاخير لدجانغو قام بتغيير مفهوم التحويل هذا

الاصدار الذي قمت بانزالة Django==1.10.2

اكتشفت أن الخطأ كان مني أنا

هلّا أعطيتني ملف urls الذي تحدث فيه المشكلة؟

انسخه محتواه و ضعه هنا

brg أضف ردا

الملف الاساسي فقط اضيف التالي

url(r'^$','index.views.index' , name='index')

بحيث اضفت ابلكيشن باسم index وبداخل ملف views عملت def index

الملف اشتغل باصدار سابق لكن بعد التحديث اردت ان ابدا بمشروع جديد لكن من البادية ظهرت انواع المشاكل بهذه

ahmed.alhaj أضف ردا

هذه الطريقة غير صحيحة، عليك استخدام الدالة include لإضافة urls من تطبيق آخر. ثم من ملف الـurls الخاص بالتطبيق تقوم بتوجيهه للــviews التي تريدها داخل نفس التطبيق.

تذكر عند استخدام الدالة include قم بحذف علامة ($)

لكي تستخدم الدالة include قم بإضافة السطر التالي لأعلى الملف:

from django.conf.urls import include

الف شكر لك اخوي احمد

سأبدا بالتجربه

وسأخبرك بما يستجد باذن الله

وان شاء الله تنجح الطريقة دقايق فقط

بعد التجربة عالسريع هذا الملف

from django.conf.urls import url
from django.contrib import admin
from django.conf.urls import include

urlpatterns = [
    url(r'^', include('views.home')),
    url(r'^admin/', admin.site.urls),
]

داخل ملف setting قمت بتعريف المجلد الخاص بالمشروع INSTALLED_APPS من هنا

داخل ملف views قمت بعمل فنكشن بسيط باسم home

الخطا الناتج

ImportError: No module named 'views'

ahmed.alhaj أضف ردا

الخطأ هنا:

url(r'^', include('views.home')),

عندما تستخدم الدالة include عليك أن توجهها لملف الـ urls داخل التطبيق الجديد، و ليس لملف الــ views

.

عليك أن تكتب اسم التطبيق أولاً "home" ثم نقطة ثم تكتب "urls"

. ليصبح السطر كالتالي: .

url(r'^', include('home.urls')),

.

أيضاً أنصحك بوضع هذا السطر في نهاية الــurlpatterns لكي لا تواجه مشكلة عن استخدام رابط الــ admin

للاسف لم ينفع الحل

بعد حذف جانغو 1.10.2 وانزال اصدار اقل جانغو1.9

اشتغل نفس مااعرف استخدامه سابقا

لربما قاموا بتغير الطريقه يحتاج لقرائة doc بموقعهم

شكرا لك

ما هي رسالة الخطأ بالضبط؟

brg أضف ردا

قمت بحذف السابق هناك عدة رسائل وليست رسالة

عند استخدام include يخبرك انه ليس باكج

وعند استخدامه بالطريقة العادية

    url(r'^s/$', 'blogs.views.home'),

يخبرك انه يجب استخدام انكلود لكن الان عند العودة للاصدار القديم 1.9 اشتغل بالطريقة الاعتيادية

     url(r'^s/$', 'blogs.views.home'),

الحمدلله

بعد 11 شهر من الرسايل

اتقنت الجانغو بشكل جيد جداً وأسعى للاحتراف

اما الاخطاء فهي فعلا تافهه جداً وكانت اخطاء مني انا شخصياً

اثناء تصفحي رأيت تعليقاتي بموضوعك واحببت ان اشاركك تجربتي

جانغو جبار بما تعنيه الكلمة وفهمة بالطريقة الصحيحة يسهل عليك بناء مشاريع ضخمة جدا

مثال مشروع مشابه لحسوب تستطيع بنائه باحترافية عالية جدا وسهولة تامة باستخدام relation ship

وبفلسفة خاصة بجانغو

مهما تعقدت المشاريع وكانت صعبه تحديدا في قواعد البيانات وترابطها

جانغو جعلها اسهل من شرب الماء


استطيع ان اقول شكرا جانغو كم انت جميل

هذي تجربتي خلال 11 شهر

وباذن الله سترى اول مشاريعي النور لن اقول قريبا ولكن ليس ببعيد

والمشروع عباره عن مجتمعات مترابطة وبه فلسفات في مجال المتابعة

هذي هي تجربتي

وفقك الله

-4
Yusufmh أضف ردا

..

-5

انا لا اعرف شيء في django لكن لماذا لاتستعمل php أو node.js أو ruby on rails فهي افصل على ما اعتقد

لأنني لا أعرف شيء في php أو node.js أو ruby on rails

-4

معك حق أخي لكن انت من الأول المفروض تحدد وجهتك إلى اين فإذا إلى الويب فتختار الأفضل، عل عموم اتمنى احد الأعضاء يفيدك وتنحل مشكلتك بإذن الله

حللتُ مشكلتي و ذكرت الحل في الموضوع، أنا هنا أسرد تجربتي فقط.

إذا نرجو أن تشرح كيف حللتها :) حتى تفيد الباحثين عن حلها عبر غوغل يوما :)

لقد حللها إقرأ الموضوع جيداً