2017-04-07 86 views
0

基本上我试图使用.get_absolute_url()来返回相对于当前应用程序运行的动态链接,换句话说,将模型url根据被调用的应用程序反转到不同的url。在Django中,如何从另一个应用程序的模型中获取当前运行的应用程序?

让我试着解释一下我试图通过实例做,我们有三个应用程序

  • 博客(作为一个共享的数据层,包含了后,作者车型...等)
  • BloggerWay(作为第一层视图,使用博客应用模型显示某些给定布局中的内容)
  • TumblrWay(作为另一个视图层,再次使用博客应用模型显示某些给定布局中的内容)

我的urls.py文件是这样

---------- 
*Project.urls.py* 
---------- 
urlpatterns= [ 
    url('/blogger/', include(BloggerWay.urls.py, namespace='blogger'), 
    url('/tumblr/', include(TumblrWay.urls.py, namespace='tumblr'),] 
---------- 
*BloggerWay.urls.py* 
---------- 
urlpatterns= [ 
    url('/post/(?P<id>\d+)', Blog.as_view(), name='blog'),] 
---------- 
*TumblrWay.urls.py* 
---------- 
urlpatterns= [ 
    url('/post/(?P<id>\d+)', Blog.as_view(), name='blog'),] 

我的问题是我如何定义.get_absolute_url()为Post模型,所以它知道我们是哪个应用在并返回方法正确的网址。

例如: 如果BloggerWay回报 '/博客/后' 如果TumblrWay回报 '/ tumblr /后'


我知道,我可以使用反向()函数来获取一个给定的命名模式的URL,它接受current_app =参数,但我的问题是我如何获得正在运行的应用程序,所以我可以通过它。

class Post(...): 
    def get_absolute_url(self): 
    WhoAmI = ... #get current app here, BUT HOW! 
    return reverse('post', current_app=WhoAmI) 

,我想避免的解决方案:

  • 我可以继承这两个应用程序的Post类,覆盖.get_absolute_url()那里,硬编码名称它中的每个应用程序的空间。然后用我的应用程序的类,而不是直接使用被定义为模型/表中的一个。(同时offcourse避免该类执行迁移,甚至更好地定义在别的地方比models.py)

回答

0

实现对他人财产get_url()为你的类。 反转功能应包括“命名空间:名为” e.g

class Post(...):... 
    def get_blogger_url(self): 
     return reverse("blogger:post", kwargs={"id":self.id}) # for Blogger 
    def get_tumblr_url(self): 
     return reverse("tumblr:post", kwargs={"id":self.id}) # for Tumblr 
+0

谢谢@Barack的意见。它会工作,但我想这不会有效,有两个原因。在处理大量使用相同模型应用程序的应用程序时,我们最终会为每个应用程序提供一种方法。当使用模板时,开发人员需要记住这些方法的名称,而不是仅仅使用get_absolute_url()方法。对名称空间进行硬编码意味着模型的应用程序将取决于开发人员使用的名称空间。 –

+0

继续:开发人员最终会修改模型的应用程序,这意味着该应用程序将失去其可插拔能力。 –

相关问题