عكس غير موجود: إرسال سياق الطلب من القوالب

StackOverflow https://stackoverflow.com/questions/744866

  •  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]+)/$'

قمت بإنشاء مشروع دمية على نظامي الذي يتطابق لك، مستنسخة الخطأ، وإدراج هذا التصحيح للنجاح. إذا لم يحل هذا مشكلتك، سأأكل قبعتي! :-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top