如何在 django 中使用 python 获取应用程序名称

发布于 2024-11-07 20:22:09 字数 60 浏览 0 评论 0原文

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

If you are in the view and want to retrieve the app name using Python ( the app name will be used for further logic ), how would you do it ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(10

难如初 2024-11-14 20:22:09

您可以这样做:

from django.core.urlresolvers import resolve

....

resolve(request.path).app_name

请参阅 如何在 Django 中获取当前应用程序 和 < a href="http://docs.djangoproject.com/en/dev/topics/http/urls/#resolve" rel="noreferrer">resolve()

编辑:您现在可以使用 request.resolver_match.app_name 避免解析第二个时间并避免导入。这样做:

request.resolver_match.app_name

You could do:

from django.core.urlresolvers import resolve

....

resolve(request.path).app_name

See How to get current application in Django and resolve()

EDIT: You can now use request.resolver_match.app_name which avoids resolving a second time and avoids an import. Do it this way:

request.resolver_match.app_name
孤独患者 2024-11-14 20:22:09
__package__

或者

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

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

__package__

or

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

should be the easiest way. Second converts a.b.c to c.

我是有多爱你 2024-11-14 20:22:09

您可以从模型中获取应用程序名称: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)
        ...
    ...

You can get application name from model: Book._meta.app_label.

I've found in 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)
        ...
    ...
伏妖词 2024-11-14 20:22:09

另一种方法是获取当前对象或使用 self.参见下文

obj.__module__.split('.')

这将返回一个列表,其中对象名称由“.”分隔。

Another way to do it is get the current object or use self. see bellow

obj.__module__.split('.')

This will return a list with the object name split up by the '.'

薄凉少年不暖心 2024-11-14 20:22:09

总而言之,如果您正在寻找代码编写位置的 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__

so to sum up, If you're looking for the app_name of where your code is written, then use this:

app_name = __package__

However, if you need the app_name of where the object is being called (which might be in an app other than coding app), then use this:

import sys
from django.urls import resolve

app_name = sys.modules[resolve(request.path_info).func.__module__].__package__
柠栀 2024-11-14 20:22:09

也许这可以帮助你..url

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,)) 

将返回你所有的地址,你可以解析它为你的应用程序和模型...

maybe this can help you..

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,)) 

url will return you all adress and you can parse it for your app and model...

分分钟 2024-11-14 20:22:09

这个解决方案不是很简单,但它有效

import sys

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

This solution not very simple, but it works

import sys

sys.modules[resolve(request.path_info).func.__module__].__package__
相权↑美人 2024-11-14 20:22:09

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

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

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

     def get_common_context(请求):
         返回 {
             '应用程序名称':'我的应用程序'
         }
    
  3. 将上下文处理器添加到 settings.py 中的模板

    <前><代码> 模板 = [
    {
    ...
    '选项': {
    '上下文处理器':[
    ...
    'myapp.context_processor.get_common_context',
    ],
    },
    },
    ]

  4. 访问模板中的 app_name。

    <前><代码> {{ 应用程序名称 }}

  5. 使用 RequestContext 访问视图中的 app_name

You can use context processors.
To create context processor for an app name do the following:

  1. Say you have an app named myapp. Inside myapp directory create a context_processor.py

  2. In context_processor.py define following method:

     def get_common_context(request):
         return {
             'app_name':'myapp'
         }
    
  3. Add your context processor to TEMPLATES in settings.py

     TEMPLATES = [
         {
             ...
             'OPTIONS': {
                 'context_processors': [
                     ...
                     'myapp.context_processor.get_common_context',
                 ],
             },
         },
     ]
    
  4. Access app_name in your template.

     {{ app_name }}
    
  5. Access app_name in your view using RequestContext

箜明 2024-11-14 20:22:09

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

我的场景是从视图调用中动态使用 moduleapp_name ,以便我可以对该特定模块进行访问权限检查。

I believe the updated solution is view.__module__. This returns your app_name both from Django and Django Rest Framework.

My scenario was working with dynamically module or app_name from view call so that I can work with access permission check for that particular module.

江湖正好 2024-11-14 20:22:09

也许我的选择对某人有用:

### apps.py
from django.apps import AppConfig


class MyApp(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'my_app'

### models.py
from .apps import MyApp
name = MyApp.name

maybe my option would work for someone:

### apps.py
from django.apps import AppConfig


class MyApp(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'my_app'

### models.py
from .apps import MyApp
name = MyApp.name
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文