我正试图解开两个应用程序:
locations.Location
和directory.Item
都包含lat / lng coords,我可以在特定lat / lng coord的特定距离内找到项目。
我想使用以下网址结构:
/locations/<location_slug>/directory/<category_slug>/
但我不想让我的目录应用程序依赖于我的位置应用程序。
如何翻译此网址以在我的目录应用中使用这样的视图?
items_near(lat, lng, distance, category):
解决方法是在某个地方创建一个新视图来翻译这个 - 但我应该把它放在哪里?如果它进入目录应用程序,那么我已将其与我的位置应用程序相结合,反之亦然。
将一个解决方法代码放在我的项目URL文件中是一个好主意吗?从而清除这两个应用程序?这样做有什么问题吗?
答案 0 :(得分:2)
要使您的urlpattern正常工作,调用的视图函数必须同时了解位置和目录。简短的回答是你可以把这个视图功能放在你想要的任何地方 - 它只是一个python函数。但是,在您的目录或位置应用程序之外,可能有一些合理的位置是有意义的。
首先,我不会将该视图代码放在您的顶级urls.py中,因为该文件适用于与URLconf相关的代码。
放置观点的几个选项:
在任何特定应用之外的文件中创建新的视图功能。 <project_root>/views.py
是一种可能性。此视图从目录应用程序调用{{1}}视图没有任何问题。
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)
中。没有要求Django应用程序需要有models.py,urls.py等。如果你想让Django正确加载应用程序(例如,如果你想要的话),请确保包括<my_new_app>/views.py
Django自动查找模板标签或应用程序特定模板。)
就个人而言,只有在项目相对简单的情况下,才会使用选项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)
无论您使用多少“可重复使用”的应用程序,都不可避免地需要特定于站点的代码。
我认为创建一个使用可重用和分离的应用程序视图的“特定于站点”的应用程序是合乎逻辑的。