2

我正在尝试解耦两个应用程序:

  1. 位置 - 包含有关某些位置(城镇、国家、地点等)的详细信息的应用程序
  2. 目录 - 包含景点(商店、火车站、酒吧等)详细信息的应用程序 - 全部分类。

两者都locations.Location包含directory.Item纬度/经度坐标,我可以在特定纬度/经度坐标的一定距离内找到项目。

我想使用以下 URL 结构:

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

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

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

items_near(lat, lng, distance, category):

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

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

4

3 回答 3

2

为了使您的 urlpattern 工作,调用的视图函数必须知道位置和目录。简短的回答是你可以把这个视图函数放在你想要的任何地方——它只是一个 python 函数。但是,在您的目录或位置应用程序之外,它可能有一些合乎逻辑的地方是有意义的。

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

放置视图的几个选项:

  1. 在位于任何特定应用程序之外的文件中创建一个新的视图函数。<project_root>/views.py是一种可能性。这个item_near(..)视图从目录应用程序调用视图没有任何问题。

    # 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)
    
  2. 创建一个新应用程序并将代码放在那里,在<my_new_app>/views.py. 没有要求 Django 应用程序需要具有 models.py、urls.py 等。__init__.py如果您希望 Django 正确加载应用程序(例如,如果您希望 Django 自动查找模板标签,请确保包含或应用特定的模板)。

就个人而言,我只会在项目相对简单并且<project_root>/views.py不会因所有内容而变得混乱的情况下选择选项 1。否则我会选择选项 2,特别是如果您预计有其他代码需要同时了解位置和目录。使用选项 2,您也可以在他们自己的应用程序特定的 urls.py 中收集相关的 urlpatterns。

于 2010-01-05T02:37:45.240 回答
0

如果您使用的是 django >=1.1 ,则从此处的 django 文档中可以将任何捕获的信息传递到包含的应用程序中。所以分成几个文件:

# 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 < 1.1 我不知道。

于 2010-01-04T22:08:27.110 回答
0

不管你的应用程序有多少“可重用”,不可避免地需要特定于站点的代码。

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

于 2010-01-05T06:30:08.313 回答