سؤال

لدي نموذج Django يحتوي على عدد كبير من الحقول وأكثر من 20000 صف جدول.لتسهيل عناوين URL القابلة للقراءة البشرية والقدرة على تقسيم القائمة الكبيرة إلى قوائم فرعية عشوائية، أود الحصول على عنوان URL يبدو كما يلي:

/browse/<name1>/<value1>/<name2>/<value2>/ .... etc ....

حيث يتم تعيين "الاسم" إلى سمة نموذج و"القيمة" هي معايير البحث لتلك السمة.سيتم التعامل مع كل "اسم" كفئة لإرجاع مجموعات فرعية من مثيلات النموذج حيث تتطابق الفئات.

الآن، يمكن التعامل مع هذا باستخدام معلمات GET، لكنني أفضل عناوين URL الأكثر قابلية للقراءة من أجل المستخدم ومحركات البحث.سيتم تضمين المجموعات الفرعية لعناوين URL هذه في كل صفحة تعرض هذا النموذج، لذا يبدو أن الأمر يستحق بذل الجهد لإنشاء عناوين URL جميلة.

من الناحية المثالية، سيتم تمرير كل زوج من الاسم/القيمة إلى وظيفة العرض كمعلمة مسماة name1, name2, ، إلخ.ومع ذلك، لا أعتقد أنه من الممكن تحديد الأنماط المسماة عبر النص المطابق للتعبير العادي.هل أنا مخطئ هناك؟

لذلك، يبدو أنني بحاجة إلى القيام بشيء مثل هذا:

urlpatterns = patterns('',
    url(r'^browse/(?:([\w]+)/([\w]+)/)+$', 'app.views.view', name="model_browse"),
)

يبدو أن هذا يجب أن يتطابق مع أي مجموعة مكونة من زوجين من الاسم/القيمة.على الرغم من أنه يطابقه بنجاح، فإنه يمرر فقط زوج الاسم/القيمة كمعلمات إلى وظيفة العرض.أعتقد أن كل مباراة تحل محل المباراة السابقة.في ظل التخمين بأن الاحتواء (؟:...)+ هو المسبب لذلك، جربت نمطًا متكررًا بسيطًا بدلاً من ذلك:

urlpatterns = patterns('',
    url(r'^browse/([\w]+/)+$', 'app.views.view', name="model_browse"),
)

...وحصلت على نفس المشكلة، ولكن هذه المرة *args يتضمن فقط النمط المطابق الأخير.

هل هذا قيد على مرسل عنوان url الخاص بـ Django و/أو دعم regex الخاص بـ Python؟يبدو أن أيًا من هاتين الطريقتين يجب أن تعمل.هل هناك طريقة لتحقيق ذلك دون ترميز كل سمة نموذج محتملة في عنوان URL كنمط اختياري (.*)؟

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

المحلول

وهناك احتمال أن كنت قد تنظر هو مطابقة السلسلة بأكملها من القيم الممكنة ضمن نمط جزء رابط وسحب أجزاء معينة في وجهة نظركم. وكمثال على ذلك:

urlpatterns = patterns('',
    url(r'^browse/(?P<match>.+)/$', 'app.views.view', name='model_browse'),
)

def view(request, match):
    pieces = match.split('/')
    # even indexed pieces are the names, odd are values
    ...

وأي وعود حول التعبير العادي اعتدت، ولكن أعتقد أنك تفهم ما أعنيه.

و(قام في محاولة لإصلاح التعبير العادي).

نصائح أخرى

وأنا أتفق مع آدم، ولكن أعتقد أن النمط في urls.py يجب أن تكون:

... r'^browse/(?P<match>.+)/$' ...

و 'ث \ "سيتم سوى مباراة والشخصيات كلمة'، لكن ''. سوف تطابق أي شيء.

ونفس الجواب جاء لي أثناء قراءة هذه المسألة.

وأعتقد عرض model_browse هو أفضل وسيلة لفرز معلمات الاستعلام واستخدامه كجهاز توجيه عام.

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

يوضح المثال التالي كيفية الحصول على جميع المبيعات اليومية لموقع ما عن طريق إدخال اسم store و ال year, month و day.

urls.py:

urlpatterns = patterns('',
    url(r'^baseurl/location/(?P<store>.+)/sales/(?P<year>[0-9][0-9][0-9][0-9])-(?P<month>[0-9][0-9])-(?P<day>[0-9][0-9])/$', views.DailySalesAtLocationListAPIView.as_view(), name='daily-sales-at-location'),
)

وبدلاً من ذلك، يمكنك أيضًا استخدام معرف المتجر عن طريق التغيير (?P<store>.+) ل (?P<store>[0-9]+).لاحظ أن location و sales ليست كلمات رئيسية، بل تعمل فقط على تحسين إمكانية قراءة عنوان URL.

وجهات النظر.py

class DailySalesAtLocationListAPIView(generics.ListAPIView):
    def get(self, request, store, year, month, day):
        # here you can start using the values from the url
        print store
        print year
        print month
        print date

        # now start filtering your model

نأمل أن يساعد أي شخص!

أطيب التحيات،

ميخائيل

ولقد حل بديل، وهي ليست مختلفة تماما عن السابق إلا أنها أكثر دقة:

وurl(r'^my_app/(((list\/)((\w{1,})\/(\w{1,})\/(\w{1,3})\/){1,10})+)$'

ولقد استعملت المعلمات رابط لم تسمها و التعبير العادي المتكررة. عدم الحصول على "ليست تعبيرا عاديا صالحا: تكرار متعددة". أضع كلمة في بداية القائمة

وأنا لا تزال تعمل في وجهة النظر تسلم القائمة. ولكن أعتقد أن سوء "تذهب من خلال وسائط أو kwargs .. لا يمكن لا يزال يقول بالضبط.

وبلدي 2 سنت

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