如果您在视图中并且想要使用Python检索应用程序名称(该应用程序名称将用于进一步的逻辑),您会如何做?
您可以这样做:
from django.core.urlresolvers import resolve
....
resolve(request.path).app_name
请参考如何在Django中获取当前应用程序和resolve()
编辑:现在你可以使用request.resolver_match.app_name,它避免了第二次解析和导入。这样做:
request.resolver_match.app_name
resolve(request.path).app_name
* 要使用 from django.urls import resolve
。你提供的两个答案都无效。 - Smit Johnthresolver_match
在中间件中不可用。 - jmunsch__package__
或者
__package__.rsplit('.', 1)[-1]
应该是最简单的方法。第二个将a.b.c
转换为c
。
__package__
返回 'project.app_name.folder'
__package__.rsplit('.', 1)[-1]
返回 'folder' - destresa您可以从模型中获取应用程序名称: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)
...
...
obj.__module__.split('.')
总之,如果你正在寻找代码编写所在的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__
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,))
该网址将返回所有地址,您可以将其解析为您的应用程序和模型...
import sys
sys.modules[resolve(request.path_info).func.__module__].__package__
我相信更新的解决方案是view.__module__
。这将从Django和Django Rest Framework中返回您的app_name
。
我的情况是在动态调用视图时使用module
或app_name
,以便我可以为该特定模块进行访问权限检查。
您可以使用上下文处理器。 要为应用程序名称创建上下文处理器,请执行以下操作:
假设你有一个名为 myapp 的应用程序。在 myapp 目录中创建 context_processor.py 文件
在 context_processor.py 文件中定义以下方法:
def get_common_context(request):
return {
'app_name':'myapp'
}
将您的上下文处理器添加到 settings.py 中的 TEMPLATES 中
TEMPLATES = [
{
...
'OPTIONS': {
'context_processors': [
...
'myapp.context_processor.get_common_context',
],
},
},
]
在您的模板中访问 app_name。
{{ app_name }}
使用 RequestContext 在您的视图中访问 app_name。
app_name = __package__.split('.')[0]
- Saeed