عكس غير موجود: إرسال سياق الطلب من القوالب
-
09-09-2019 - |
سؤال
ملاحظة: تم تحرير هذا السؤال بشكل كبير قبل إعطاء الإجابة الأولى.
أهلا،
أنا جديد إلى حد ما على django، لذلك الاعتذار إذا فقدت شيئا واضحا.
لدي ملف URLS.py يشبه هذا:
urlpatterns = patterns(
'',
(r'^$', 'faros.lantern.views.home_page'),
(r'^login/$', 'django.contrib.auth.views.login'),
(r'^logout/$', 'django.contrib.auth.views.logout'),
(r'^about/$', 'faros.lantern.views.about_page_index', {}, 'about_page_index'),
(r'^about/(?P<page_id>([a-z0-9]+/)?)$', 'faros.lantern.views.about_page', {}, 'about_page'),
)
وجهات النظر التي تبدو وكأنها هذه:
def about_page_index(request):
try:
return render_to_response('lantern/about/index.html', context_instance=RequestContext(request))
except TemplateDoesNotExist:
raise Http404
def about_page(request, page_id):
page_id = page_id.strip('/ ')
try:
return render_to_response('lantern/about/' + page_id + '.html', context_instance=RequestContext(request))
except TemplateDoesNotExist:
raise Http404
والقالب الذي يشمل هذا:
<a href="{% url lantern.views.about_page_index %}">Contact</a>
<a href="{% url lantern.views.about_page page_id="contact" %}">Contact</a>
أحصل على رسالة الخطأ هذه:
Caught an exception while rendering: Reverse for '<function about_page at 0x015EE730>' with arguments '()' and keyword arguments '{'page_id': u'contact'}' not found. The first reverse works fine (about_page_index), generating the correct URL without error messages.
أعتقد أن هذا هو أن حجة الطلب لعرض about_page (request
) يستخدم، لذلك أحتاج إلى نقله عند إنشاء عنوان URL في قالب الخاص بي. المشكلة هي أنه لا أعرف كيفية الوصول إليها، والبحث حوله لا يحصل لي في أي مكان. أيه أفكار؟
شكرا،
دوم
PS جانبا، هل هذه طريقة التعامل مع ساكنة "حول" نوع الصفحات في التطبيق تبدو مروعة أو معقولة؟ أنا في الأساس أخذ عناوين URL وافتراض الطريق إلى القالب هو ما يأتي بعد about/
قليل. هذا يعني أنني أستطيع أن أجعل الصفحات الثابتة تبدو وكأنها جزء من التطبيق، وبالتالي يمكن للمستخدم القفز في قسم حول القسم ثم العودة إلى حيث جاءوا منه. تعليقات / تعليقات حول ما إذا كان هذا هو djangoic أو غبي تقدير!
المحلول
إذا أعتقد بشكل صحيح من توقيع وظيفة العرض الخاصة بك (def about_page(request, page_id = None):
)، من المحتمل أن يكون لديك تكوين URL آخر يشير إلى نفس الرأي ولكن هذا لا يأخذ page_id
معامل. إذا كان الأمر كذلك، فإن وظيفة Django العكسي سترى واحدة فقط من هذه، وربما تشاهد واحد دون اسمه page_id
نمط regex. هذا هو gotcha شائع جدا مع عكس! :-)
للحصول على هذا، قم بتعيين اسم لكل من أنماط URL (انظر بناء جملة متغير URLPatterns). في حالة مثالك، كنت تفعل:
(r'^about/(?P<page_id>([a-z]+/)?)$', 'faros.lantern.views.about_page',
{}, 'about_with_page_id')
ثم في القالب:
<a href="{% url about_with_page_id page_id="contact" %}">Contact</a>
يحرر
شكرا لنشر URL.py المحدث. في ال url
علامة القالب، باستخدام اسم النمط غير المؤهل يجب أن تفعل الخدعة (لاحظ أنني أحذف lantern.views
جزء:
<a href="{% url about_page_index %}">Contact</a>
<a href="{% url about_page page_id="contact" %}">Contact</a>
Edit2.
أنا آسف لم أكن غصين هذا سابقا. يتم التعبير عن النمط الخاص بك بطريقة لا يمكن أن تعيش فيها django، وهذا هو ما يسبب عدم التطابق. بدلا من:
r'^about/(?P<page_id>([a-z]+/)?)$'
استعمال:
r'^about/(?P<page_id>[a-z0-9]+)/$'
قمت بإنشاء مشروع دمية على نظامي الذي يتطابق لك، مستنسخة الخطأ، وإدراج هذا التصحيح للنجاح. إذا لم يحل هذا مشكلتك، سأأكل قبعتي! :-)