2011-12-08 47 views
4

我一直在尋找這個問題,找不到任何,抱歉,如果它重複。Django:URLconf中的可變參數

我正在建造某種電子商務網站,類似於易趣。當我試圖瀏覽「類別」和「過濾器」時出現問題。例如。您可以瀏覽「監視器」類別。這會告訴你很多顯示器,以及一些過濾器(與eBay完全相同)來應用它們。所以,你去 「顯示器」,然後你有一個像過濾器:

  • 類型:LCD - LED - CRT
  • 品牌:優派 - LG - 三星
  • 最大分辨率:800×600 - 1024×768

而這些過濾器將被添加到URL,用例子下面,當您瀏覽顯示器的URL可以是這樣的:

store.com/monitors 

如果你申請的 「類型」 過濾:

store.com/monitors/LCD 

「品牌」:

store.com/monitors/LCD/LG 

「最高分辨率」:

store.com/monitors/LCD/LG/1024x768 

所以,總而言之,URL結構會是這樣如:

/category/filter1/filter2/filter3 

我無法弄清楚如何真正做到這一點。問題是過濾器可能是可變的。我認爲在該視圖中需要使用**kwargs,但我並不確定。

你有什麼想法如何捕捉那種參數?

非常感謝!

+0

你的過濾器是否有明確的順序?或者都是'/ LG/LCD'和'/ LCD/LG'有效? – second

+0

不,沒有訂單。考慮一下。你可以瀏覽監視器,並有興趣檢查液晶顯示器和其他人可能想按品牌過濾。 – santiagobasulto

+0

如果它沒有訂單,您如何期待任何代碼知道「LCD」是一種類型而不是品牌? – Ben

回答

3

本,我希望這將有助於你

urls.py

from catalog.views import catalog_products_view 

urlpatterns = patterns(
    '', 
    url(r'^(?P<category>[\w-]+)/$', catalog_products_view, name="catalog_products_view"), 
    url(r'^(?P<category>[\w-]+)/(?P<filter1>[\w-]+)/$', catalog_products_view, name="catalog_products_view"), 
    url(r'^(?P<category>[\w-]+)/(?P<filter1>[\w-]+)/(?P<filter2>[\w-]+)/$', catalog_products_view, name="catalog_products_view"), 
    url(r'^(?P<category>[\w-]+)/(?P<filter1>[\w-]+)/(?P<filter2>[\w-]+)/(?P<filter3>[\w-]+)/$', catalog_products_view, name="catalog_products_view"), 
) 

view.py

def catalog_products_view(request, category, filter1=None, filter2=None, filter3=None): 
    # some code here 

def catalog_products_view(request, category, **kwargs): 
    filter1 = kwargs['filter1'] 
    filter2 = kwargs['filter2'] 
    .... 
    filterN = kwargs['filterN'] 
    # some code here 
+0

這正是我想要的!但是,有什麼辦法可以避免URL的硬編碼?我的意思是,在url.py中,你明確地放置了過濾器,這就是可變的。 – santiagobasulto

+0

爲了避免硬編碼,你可以使用正則表達式'r'^(?P [\ w-] +)/(?P [\ w \ /] +)/ $'並且在視圖中將'complex_filter'拆分爲' /」 –

0

你打算如何決定哪個方面被過濾?你有每個類別的接受關鍵字清單嗎?即服務器是如何知道

/LCD/LG/ 

意味着type=LCD, brand=LG

/LG/LCD 

並不意味着type=LG, brand=LCD

有沒有你不想要任何理由使用GET參數,例如

.../search/?make=LD&size=42 
+0

是的,我假設有一個唯一的字符串表示。我可以做/ 13-LCD/18-LG,並有ID ...這些是過濾器,並駐留在一個單一的模型過濾器,所以它不會是問題。關於GET參數。我已經想到了,不喜歡。我也可以解析網址,我的意思是,這很簡單。第一個參數是類別,其他參數是過濾器。但是,我在想,通過URLconf的某些功能,我可以得到一個列表,或者其他的東西。謝謝您的回答! – santiagobasulto

1

你可以添加到您的網址:

url(r'^(?P<category>\w)/(?P<filters>.*)/$', 'myview'), 

然後MyView的將獲得類別和過濾器的參數。您可以在「/」上分隔過濾器並在「過濾器」表中搜索每個零件。

這有道理嗎?

+0

是的,它的確如此。我現在正在做類似的事情。謝謝! – santiagobasulto