解耦django应用程序2 - 如何从URL中的slug获取对象信息

时间:2010-01-04 19:00:15

标签: django django-urls decoupling

我正试图解开两个应用程序:

  1. 地点 - 包含有关某个地点(城镇,国家/地区等)的详细信息的应用
  2. 目录 - 包含感兴趣地点(商店,火车站,酒吧等)详情的应用程序 - 全部归类。
  3. locations.Locationdirectory.Item都包含lat / lng coords,我可以在特定lat / lng coord的特定距离内找到项目。

    我想使用以下网址结构:

    /locations/<location_slug>/directory/<category_slug>/

    但我不想让我的目录应用程序依赖于我的位置应用程序。

    如何翻译此网址以在我的目录应用中使用这样的视图?

    items_near(lat, lng, distance, category):
    

    解决方法是在某个地方创建一个新视图来翻译这个 - 但我应该把它放在哪里?如果它进入目录应用程序,那么我已将其与我的位置应用程序相结合,反之亦然。

    将一个解决方法代码放在我的项目URL文件中是一个好主意吗?从而清除这两个应用程序?这样做有什么问题吗?

3 个答案:

答案 0 :(得分:2)

要使您的urlpattern正常工作,调用的视图函数必须同时了解位置和目录。简短的回答是你可以把这个视图功能放在你想要的任何地方 - 它只是一个python函数。但是,在您的目录或位置应用程序之外,可能有一些合理的位置是有意义的。

首先,我不会将该视图代码放在您的顶级urls.py中,因为该文件适用于与URLconf相关的代码。

放置观点的几个选项:

  1. 在任何特定应用之外的文件中创建新的视图功能。 <project_root>/views.py是一种可能性。此视图从目录应用程序调用{​​{1}}视图没有任何问题。

    item_near(..)
  2. 创建一个新应用并将代码放在# in myproject/urls.py urlpatterns = ( ... (r'/locations/(?P<location_slug>[\w\-]+)/directory/(?P<category_slug>[\w\-]+)/', 'myproject.views.items_near_from_slug') ) # in myproject/views.py from directory.views import items_near def items_near_from_slug(request, location_slug, category_slug): location = get_object_or_404(Location, slug=location_slug) distance = 2 # not sure where this comes from # And then just invoke the view from your Directory app return items_near(request, location.lat, location.lng, distance, category_slug) 中。没有要求Django应用程序需要有models.py,urls.py等。如果你想让Django正确加载应用程序(例如,如果你想要的话),请确保包括<my_new_app>/views.py Django自动查找模板标签或应用程序特定模板。)

  3. 就个人而言,只有在项目相对简单的情况下,才会使用选项1,并且__init__.py不会因为所有内容的观点而变得混乱。否则我会使用选项2,特别是如果您预计其他代码需要知道位置和目录。使用选项2,您也可以在自己的应用程序特定的urls.py中收集相关的urlpatterns。

答案 1 :(得分:0)

如果您正在使用django&gt; = 1.1,请从django docs here开始,然后您可以将任何捕获的信息传递到所包含的应用程序中。因此,拆分几个文件:

# in locations.urls.py

urlpatterns = ('',
  (r'location/(?P<location_slug>.*?)/', include('directory.urls')),
  #other stuff
  )


# in directory.urls.py

urlpatterns = ('',
  (r'directory/(?P<directory_slug>.*?)/', 'directory.views.someview'),
  #other stuff
  )

# in directory.views.py

def someview(request, location_slug = None, directory_slug = None):
 #do stuff

希望有所帮助。如果你在django&lt; 1.1我不知道。

答案 2 :(得分:0)

无论您使用多少“可重复使用”的应用程序,都不可避免地需要特定于站点的代码。

我认为创建一个使用可重用和分离的应用程序视图的“特定于站点”的应用程序是合乎逻辑的。