1

Тема: Імпорт Python

Доброго дня!

Стикнувся з проблемою, вже 2 день не можу нічого придумати. Google не допоміг або я погано шукав :)

Отож, Є один пакет для Django - https://github.com/ulule/django-badgify (дозволяє робити досягнення користувачів)

Все було чудово, але мені зараз треба розширити їхню модель Badge - https://github.com/ulule/django-badgify#custom-models

Все зробив як пише в доках,

from badgify.models.base.badge import Badge as BaseBadge

class GuidaBadge(BaseBadge):
    class Meta(BaseBadge.Meta):
        abstract = False

але manage.py shell (чи migrate чи runserver) вибиває помилку:

 
File "D:\virtenvs\mysite\mysite\main\models.py", line 11, in <module>
    from badgify.models.base.badge import Badge as BaseBadge
File "D:\virtenvs\mysite\lib\site-packages\badgify\models\__init__.py", line 8, in <module>
    Badge = load_class(settings.BADGE_MODEL)
File "D:\virtenvs\mysite\lib\site-packages\badgify\utils.py", line 88, in load_class
    raise exceptions.ImproperlyConfigured(txt)
django.core.exceptions.ImproperlyConfigured: Backend module "main.models" does not define a "GuidaBadge" class.

Тобто це оця помилка- https://github.com/ulule/django-badgify … ils.py#L79

Наскільки я розумію, python не знайшов в main.models класу GuidaBadge.

python зайшов в main\models.py, побачив там

from badgify.models.base.badge import Badge as BaseBadge

далі пішов по тому шляху імпортувати Badge, а там в badgify.models.__init__.py :

Badge = load_class(settings.BADGE_MODEL)

- просять завантажити клас що вказаний в settings -  ('main.models.GuidaBadge')

Але pyton ще не виконав коду з main.models і не бачить класу GuidaBadge ?
Правильно я розумію?

PS. Пробував імпортувати функцію (через shell) load_class і вручну передати 'main.models.GuidaBadge' - працює чудово.

2

Re: Імпорт Python

1) перший шматок коду - це в якому файлі? теоретично має бути шось типу "yourapp/models.py"
2) можна побачити структура проекту?
3) можна побачити файл settings.py?

3 Востаннє редагувалося Q-bart (29.01.2016 12:45:20)

Re: Імпорт Python

Master_Sergius написав:

1) перший шматок коду - це в якому файлі? теоретично має бути шось типу "yourapp/models.py"
2) можна побачити структура проекту?
3) можна побачити файл settings.py?

1 - так це модель (main/models.py)
2) - структуру чого? badgify? чи мого проекту?
3 -

Прихований текст
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sitemaps',
    'django.contrib.sites',
    'django.contrib.flatpages',
    'core',
    'main',
    'ajax_pages',
    'search',
    'badgify',
)

# badgify settings 
BADGIFY_BADGE_MODEL = "main.models.GuidaBadge"


MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django_user_agents.middleware.UserAgentMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
)



TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.contrib.auth.context_processors.auth',
                'django.core.context_processors.debug',
                'django.core.context_processors.i18n',
                'django.core.context_processors.request',
                'django.core.context_processors.static',
                'django.contrib.messages.context_processors.messages',
            ]
        },
    },
]

LANGUAGE_CODE = 'uk'

TIME_ZONE = 'Europe/Kiev'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/dev/howto/static-files/

STATIC_URL = '/static/'

MEDIA_URL = '/media/'

STATIC_ROOT = os.path.join(BASE_DIR, "static")

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

4

Re: Імпорт Python

2) структура ВАШОГО проекту

5

Re: Імпорт Python

mysite/
   mysite/
       __init__.py
       urls.py
       settings.py
   main/
       __init__.py
       admin.py
       urls.py
       models.py
       views.py

6

Re: Імпорт Python

Скоріше всього якась проблема у тому вашому першому шматку коду. Спробуйте імпортувати без "as" а так як є

Ось код із того гайду:

from badgify.models import base


class Badge(base.Badge):
    # you own fields / logic here
    class Meta(base.Badge.Meta):
        abstract = False

У вас же -

from badgify.models.base.badge import Badge

, і відповідно, ви будуєте клас зовсім на іншому об'єкті, окрім того, там у вашому варіанті не імпортується модуль, а, можливо, він потрібен.

7

Re: Імпорт Python

Да я читав ту "документацію", але подивіться в їхню папку моделс.. і isuue про власну модель

8

Re: Імпорт Python

Ну, трохи гімняна структура, і все ж, мабуть варто дотримуватися документації. До речі, у вас виконані вимоги сумісності?

Compatibility

python 2.7: Django 1.8, 1.9
Python 3.4: Django 1.8, 1.9

9

Re: Імпорт Python

Master_Sergius написав:

Ну, трохи гімняна структура, і все ж, мабуть варто дотримуватися документації. До речі, у вас виконані вимоги сумісності?

Compatibility

python 2.7: Django 1.8, 1.9
Python 3.4: Django 1.8, 1.9

Да я перше робив на 1.7, потім побачив це і перейшов до 1.8 ... Нічого не допомогло

10

Re: Імпорт Python

Master_Sergius написав:

Ну, трохи гімняна структура, і все ж, мабуть варто дотримуватися документації.

from badgify.models import base

- це з документації.
В base нема ніякого Badge класу,  там тільки модуль badge.py і в ньому клас Badge. Чи я неправильно розумію що в python регістр має значення?

11

Re: Імпорт Python

Загалом, на stakowrflow сказали що це через циклічний імпорт. І порадили замість

from badgify.models.base.badge import Badge as BaseBadge

використовувати

import badgify.models.base.badge

але це не допомогло.