سؤال

هل هناك طريقة لتمرير المعلمة الافتراضية إلى الإجراء في حالة عدم تطابق التعبير العادي مع أي شيء باستخدام django؟


urlpatterns = patterns('',(r'^test/(?P<name>.*)?$','myview.displayName'))

#myview.py
def displayName(request,name):
      # write name to response or something

لقد حاولت تعيين المعلمة الثالثة في أنماط url إلى قاموس يحتوي على "" وإعطاء معلمة الاسم قيمة افتراضية في الطريقة، ولم ينجح أي منها.يبدو أن معلمة الاسم دائمًا لا شيء.لا أرغب حقًا في ترميز التحقق من عدم وجود شيء إذا كان بإمكاني تعيين قيمة افتراضية.

إيضاح:هنا مثال على ما كنت أغيره إليه.


def displayName(request,name='Steve'):
      return HttpResponse(name)
#i also tried

urlpatterns = patterns('',
      (r'^test/(?P<name>.*)?$',
        'myview.displayName',
        dict(name='Test')
      )
)

عندما أوجه متصفحي في العرض ، يعرض النص "لا شيء"

أيه أفكار؟

هل كانت مفيدة؟

المحلول

تكمن المشكلة في أنه عند مطابقة النمط مع "اختبار/"، فإن المجموعة التي تم التقاطها بواسطة التعبير العادي تحتوي على التعيين "اسم" => لا شيء:

>>> url.match("test/").groupdict()
{'name': None}

هذا يعني أنه عند استدعاء العرض، فإن استخدام شيء أتوقعه مشابه لما يلي:

view(request, *groups, **groupdict)

وهو ما يعادل:

view(request, name = None)

لـ "اختبار/"، مما يعني أنه تم تعيين الاسم "لا شيء" بدلاً من عدم تعيينه.

هذا يترك لك خيارين.أنت تستطيع:

  1. تحقق بشكل صريح من عدم وجود أي شيء في كود العرض وهو نوع من الاختراق.
  2. أعد كتابة قاعدة إرسال عنوان URL لجعل التقاط الاسم غير اختياري وقدم قاعدة ثانية للالتقاط عند عدم توفير اسم.

على سبيل المثال:

urlpatterns = patterns('',
    (r'^test/(?P<name>.+)$','myview.displayName'), # note the '+' instead of the '*'
    (r'^test/$','myview.displayName'),
)

عند اتباع الطريقة الثانية، يمكنك ببساطة استدعاء الطريقة بدون نمط الالتقاط، والسماح لبايثون بالتعامل مع المعلمة الافتراضية أو يمكنك استدعاء طريقة عرض مختلفة تفوضها.

نصائح أخرى

أنا <م> يعتقد هل يمكن أن def displayName(request, name=defaultObj). وهذا ما فعلته في الماضي، على الأقل. ماذا كنت تحديد القيمة الافتراضية ل؟

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