Django - 网址结构

时间:2013-06-01 17:14:00

标签: python 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,这是可以接受的,因为网址模式几乎相同。

该类别是否应放在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

2 个答案:

答案 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"),
...

希望这有帮助!

答案 1 :(得分:1)

我取决于优先级。我有使用用户名和常规URL的用例。所以我计划的是给予用户较少的优先权。

要记住两件事:

<强> 1.Priority

如果您认为位置更重要,请优先考虑位置。 但如果两者都很重要,唯一的选择就是使用:

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

<强> 2.Parent - 子

这也取决于父母和孩子的关系。所以,你会知道哪个更重要。

/location/category/
/category/location/