2013-06-01 65 views
1

我應該如何設計url或視圖來保持url結構,如下例所示:Django - url結構

example.com/location/ 
example.com/category/ 
example.com/location/category/ 

url(r'^$', IndexView.as_view(), name='index'), 
url(r'^(?P<town>[\w\-_]+)/$', TownView.as_view(), name="town_detail"), 
url(r'^(?P<category_slug>[\w\-_]+)/$', CategoryView.as_view(), name="category_list"), 

當我嘗試訪問類別下的URL我收到路由到TownView因爲URL模式幾乎是相同的這是可以接受的。

該類別應該放在example.com/c/category/下嗎?

編輯:

我沒有解決辦法我展示我下面的問題。 所有答案都非常好,樂於助人。

我將不得不驗證此解決方案的行爲方式並檢查它是否會導致任何問題。

url(r'^(?P<slug>[\w\-_]+)/$', BrowseView.as_view(), name="category_list"), 
url(r'^(?P<slug>[\w\-_]+)/$', BrowseView.as_view(), name="town_detail"), 


class BaseView(ListView): 
    queryset = Advert.objects.all().select_related('category',) 
    template_name = "adverts/category_view.html" 


class BrowseView(BaseView): 

    def get_queryset(self, *args, **kwargs): 
     qs = super(BrowseView, self).get_queryset(*args, **kwargs) 

     try: 
      category = Category.objects.get(slug=self.kwargs['slug']) 
     except ObjectDoesNotExist: 
      object_list = qs.filter(location__slug=self.kwargs['slug']) 
     else: 
      category_values_list = category.get_descendants(include_self=True).values_list('id', flat=True) 
      object_list = qs.filter(category__in=category_values_list) 

     return object_list 
+0

這兩個都非常重要,我見過一些網站以我想要的方式處理位置和類別。 創建一個試圖獲取類別或城鎮的視圖是否正確? 它會產生額外的查詢,但在我看來它會做的伎倆。 – Efrin

+0

創建它會給應用程序帶來額外的開銷。就像創建中間視圖一樣,檢查(可能是數據庫命中),如果是位置或類別,然後路由請求。一切都可以完成,但我更喜歡:) –

回答

2

是的,正則表達式是相同的,Django的需要匹配,如此你有問題的第一個。你可以做一些調整來區分它們。例如,你建議的那個很好。您還可能有更詳細,以更加人性化和設計它們是這樣的:

example.com/location/<location name> 
example.com/category/<category name> 
example.com/location/<location name>/category/<category name> 

這樣,你應該用這個做:

url(r'^$', IndexView.as_view(), name='index'), 
url(r'^/location/(?P<town>[\w\-_]+)/$', TownView.as_view(), name="town_detail"), 
url(r'^/category/(?P<category_slug>[\w\-_]+)/$', CategoryView.as_view(), name="category_list"), 
# this one I supposed you'll need for the third one (sort of) 
url(r'^/location/(?P<town>[\w\-_]+)/category/(?P<category_slug>[\w\-_]+)/$', Location_CategoryView.as_view(), name="location_category_list"), 
... 

希望這有助於!

+0

這兩種解決方案都非常有幫助,我無法決定應該接受哪一個。我還更新了第一篇文章,提出瞭解決方案的想法。 – Efrin

1

我依賴於優先級。我有使用用戶名和常規URL的用例。因此,我計劃給予用戶更少的優先權。

兩件事情要記住:

1.Priority

如果你認爲的位置,更重要的爲主到的位置。 但如果兩者都很重要的唯一選擇是使用:

r'^(?P/location/<town>[\w\-_]+)/$' 
r'^(?P/category/<category_slug>[\w\-_]+)/$' 

2.Parent-兒童

這也取決於父母和孩子relationship.So,你就會知道哪個更重要。

/location/category/ 
/category/location/