如何在Django中使用Python获取应用程序名称

31
如果您在视图中并且想要使用Python检索应用程序名称(该应用程序名称将用于进一步的逻辑),您会如何做?

1
app_name = __package__.split('.')[0] - Saeed
9个回答

32

8
在Python3/Django2中,*resolve(request.path).app_name* 要使用 from django.urls import resolve。你提供的两个答案都无效。 - Smit Johnth
@Henry,我想获取app_label而不是app_name。有没有办法在views.py内获取app_label? 或者通过app_name获取app_label? - S.K
3
resolver_match 在中间件中不可用。 - jmunsch

8
__package__

或者

__package__.rsplit('.', 1)[-1]

应该是最简单的方法。第二个将a.b.c转换为c


1
__package__ 返回 'project.app_name.folder' __package__.rsplit('.', 1)[-1] 返回 'folder' - destresa

7

您可以从模型中获取应用程序名称:Book._meta.app_label

我在django/contrib/admin/widgets.py中找到了:

class RelatedFieldWidgetWrapper(forms.Widget):
    ...
    def get_context(self, name, value, attrs):
        from django.contrib.admin.views.main import IS_POPUP_VAR, TO_FIELD_VAR
        rel_opts = self.rel.model._meta
        info = (rel_opts.app_label, rel_opts.model_name)
        ...
    ...

6
另一种方法是获取当前对象或使用self。请参见下面的示例:
obj.__module__.split('.')

这将返回一个由对象名称按 '.' 分割的列表。

7
抱歉,obj是什么? - Smit Johnth

4

总之,如果你正在寻找代码编写所在的app_name,那么请使用以下代码:

app_name = __package__

但是,如果您需要调用对象的app_name(可能在其他应用程序中而不是编码应用程序中),则请使用以下内容:

import sys
from django.urls import resolve

app_name = sys.modules[resolve(request.path_info).func.__module__].__package__

3
也许这可以帮助你...
from django.core import urlresolvers
from django.contrib.contenttypes.models import ContentType

content_type = ContentType.objects.get_for_model(self.__class__) 
url = urlresolvers.reverse("admin:%s_%s_change" % (content_type.app_label, 
      content_type.model), args=(self.id,)) 

该网址将返回所有地址,您可以将其解析为您的应用程序和模型...


2
最初的回答:这个解决方案并不是很简单,但它有效。
import sys

sys.modules[resolve(request.path_info).func.__module__].__package__

0

我相信更新的解决方案是view.__module__。这将从Django和Django Rest Framework中返回您的app_name

我的情况是在动态调用视图时使用moduleapp_name,以便我可以为该特定模块进行访问权限检查。


0

您可以使用上下文处理器。 要为应用程序名称创建上下文处理器,请执行以下操作:

  1. 假设你有一个名为 myapp 的应用程序。在 myapp 目录中创建 context_processor.py 文件

  2. 在 context_processor.py 文件中定义以下方法:

     def get_common_context(request):
         return {
             'app_name':'myapp'
         }
    
  3. 将您的上下文处理器添加到 settings.py 中的 TEMPLATES 中

     TEMPLATES = [
         {
             ...
             'OPTIONS': {
                 'context_processors': [
                     ...
                     'myapp.context_processor.get_common_context',
                 ],
             },
         },
     ]
    
  4. 在您的模板中访问 app_name。

     {{ app_name }}
    
  5. 使用 RequestContext 在您的视图中访问 app_name。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接