Если вы находитесь в представлении и хотите получить имя приложения с помощью Python (имя приложения будет использоваться для дальнейшей логики), как вы это сделаете?
Как получить имя приложения, используя python в django
Ответ 1
Вы могли бы сделать:
from django.core.urlresolvers import resolve
....
resolve(request.path).app_name
См. Как получить текущее приложение в Django и resol()
.ОБНОВЛЕНИЕ: теперь вы можете использовать request.resolver_match.app_name, что позволяет избежать повторного разрешения и избежать импорта. Сделайте это так:
request.resolver_match.app_name
Ответ 2
Другой способ сделать это - получить текущий объект или использовать self. см. ниже
obj.__module__.split('.')
Это вернет список с именем объекта, разделенным символом '.'
Ответ 3
Вы можете получить имя приложения из модели: 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)
...
...
Ответ 4
возможно, это может помочь вам.
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 вернет вам весь адрес, и вы сможете проанализировать его для своего приложения и модели...
Ответ 5
__package__
или
__package__.rsplit('.', 1)[-1]
должен быть самым простым способом. Второй преобразует a.b.c
в c
.
Ответ 6
Это решение не очень простое, но оно работает
import sys
sys.modules[resolve(request.path_info).func.__module__].__package__