【发布时间】:2013-06-01 17:14:00
【问题描述】:
我应该如何设计 url 或视图以保持如下示例中的 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
【问题讨论】:
-
两者都非常重要,我见过一些网站以我想要的方式处理位置和类别。创建一个尝试获取类别或城镇的视图是否正确?它会产生额外的查询,但在我看来它会成功。
-
创建它会给应用程序带来额外的开销。就像创建中间视图一样,检查(可能是数据库命中)是位置还是类别,然后路由请求。一切都可以完成,但我宁愿亲吻:)