django - 迁移和模型翻译的问题

sog*_*ing 3 python django django-south django-modeltranslation

我正在尝试将我的应用程序从 Django v1.6.11 升级到 v1.7.8。我按照说明从南方升级,但一次又一次遇到相同的错误。更确切地说:

\n\n
$ python manage.py migrate makemigrations\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/reversion/admin.py:385: RemovedInDjango18Warning: commit_on_success is deprecated in favor of atomic.\n  def recover_view(self, request, version_id, extra_context=None):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/reversion/admin.py:397: RemovedInDjango18Warning: commit_on_success is deprecated in favor of atomic.\n  def revision_view(self, request, object_id, version_id, extra_context=None):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `VersionMetaAdmin.queryset` method should be renamed `get_queryset`.\n  .__new__(mcs, name, bases, attrs))\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/cms/publisher/manager.py:5: RemovedInDjango18Warning: `PublisherManager.get_query_set` method should be renamed `get_queryset`.\n  class PublisherManager(models.Manager):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/cms/models/managers.py:15: RemovedInDjango18Warning: `PageManager.get_query_set` method should be renamed `get_queryset`.\n  class PageManager(PublisherManager):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/cms/admin/change_list.py:39: RemovedInDjango18Warning: `CMSChangeList.get_query_set` method should be renamed `get_queryset`.\n  class CMSChangeList(ChangeList):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/cms/admin/forms.py:397: RemovedInDjango18Warning: Creating a ModelForm without either the \'fields\' attribute or the \'exclude\' attribute is deprecated - form PagePermissionInlineAdminForm needs updating\n  class PagePermissionInlineAdminForm(forms.ModelForm):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/cms/admin/forms.py:499: RemovedInDjango18Warning: Creating a ModelForm without either the \'fields\' attribute or the \'exclude\' attribute is deprecated - form ViewRestrictionInlineAdminForm needs updating\n  class ViewRestrictionInlineAdminForm(PagePermissionInlineAdminForm):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/cms/admin/forms.py:548: RemovedInDjango18Warning: Creating a ModelForm without either the \'fields\' attribute or the \'exclude\' attribute is deprecated - form PageUserForm needs updating\n  class PageUserForm(UserCreationForm, GenericCmsPermissionForm):\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `PagePermissionInlineAdmin.queryset` method should be renamed `get_queryset`.\n  .__new__(mcs, name, bases, attrs))\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `ViewRestrictionInlineAdmin.queryset` method should be renamed `get_queryset`.\n  .__new__(mcs, name, bases, attrs))\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/forms/widgets.py:143: RemovedInDjango18Warning: `PageUserAdmin.queryset` method should be renamed `get_queryset`.\n  .__new__(mcs, name, bases, attrs))\n\n/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/template/base.py:290: RemovedInDjango18Warning: \'The `firstof` template tag is changing to escape its arguments; the non-autoescaping version is deprecated. Load it from the `future` tag library to start using the new behavior.\n  compiled_result = compile_func(self, token)\n\nTraceback (most recent call last):\n  File "manage.py", line 10, in <module>\n    execute_from_command_line(sys.argv)\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line\n    utility.execute()\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute\n    django.setup()\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup\n    apps.populate(settings.INSTALLED_APPS)\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/apps/registry.py", line 115, in populate\n    app_config.ready()\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/contrib/admin/apps.py", line 22, in ready\n    self.module.autodiscover()\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/contrib/admin/__init__.py", line 23, in autodiscover\n    autodiscover_modules(\'admin\', register_to=site)\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/utils/module_loading.py", line 74, in autodiscover_modules\n    import_module(\'%s.%s\' % (app_config.name, module_to_search))\n  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module\n    __import__(name)\n  File "/home/roberto/workspace/unicms/unicms/unicms/admin.py", line 24, in <module>\n    admin.site.register(ResearchArea, ResearchAreaAdmin)\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/django/contrib/admin/sites.py", line 104, in register\n    self._registry[model] = admin_class(model, self)\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/modeltranslation/admin.py", line 239, in __init__\n    super(TranslationAdmin, self).__init__(*args, **kwargs)\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/modeltranslation/admin.py", line 28, in __init__\n    self.trans_opts = translator.get_options_for_model(self.model)\n  File "/home/roberto/virtualenvs/ve_unicms-django1.7/local/lib/python2.7/site-packages/modeltranslation/translator.py", line 519, in get_options_for_model\n    \'translation\' % model.__name__)\nmodeltranslation.translator.NotRegistered: The model "ResearchArea" is not registered for translation\n
Run Code Online (Sandbox Code Playgroud)\n\n

在我看来,这似乎是一个 django-modeltranslation 问题。我已经在他们的网站上检查了依赖项,并且使用了正确的设置:django 1.7.11、python 2.7.5、django-modeltranslation 0.8。

\n\n
$ pip freeze\nBeautifulSoup==3.2.1\nDjango==1.7.8\nDjango-Select2==4.3.1\nFabric==1.10.1\nPillow==2.8.1\nSouth==1.0.2\nargparse==1.2.1\ncmsplugin-news==0.4.4\ndjango-analytical==0.21.0\ndjango-ckeditor==4.4.7\ndjango-classy-tags==0.6.1\ndjango-cms==3.0.13\ndjango-cookie-law==1.0.2\ndjango-country-dialcode==0.6.1\ndjango-debug-toolbar==1.3.0\ndjango-extensions==1.5.3\ndjango-fabric==2.0.2\ndjango-ga-tracking==0.0.6\ndjango-guardian==1.2.5\ndjango-haystack==2.3.1\ndjango-modeltranslation==0.8\ndjango-mptt==0.6.1\ndjango-redis-cache==0.13.1\ndjango-reusableapps==0.1.1\ndjango-reversion==1.7.1\ndjango-sekizai==0.8.1\ndjango-tinymce==1.5.3\ndjango-treebeard==3.0\ndjangocms-admin-style==0.2.5\ndjangocms-file==0.1\ndjangocms-link==1.6.1\ndjangocms-picture==0.1\ndjangocms-text-ckeditor==2.4.3\ndjangocms-video==0.1\neasy-thumbnails==2.2\necdsa==0.13\nelasticsearch==1.4.0\nfeedparser==5.2.0\nhiredis==0.2.0\nhtml5lib==0.99999\nparamiko==1.15.2\npsycopg2==2.6\npycrypto==2.6.1\npyelasticsearch==1.2.3\npython-ldap==2.4.19\npytz==2015.2\nredis==2.10.3\nrequests==2.7.0\nsimplejson==3.6.5\nsix==1.9.0\nsqlparse==0.1.15\nswitch2bill-common==2.8.5\nurllib3==1.10.4\nwsgiref==0.1.2\nxmltodict==0.9.2\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意:如果我从 virtualenv 中卸载 South,我仍然会收到相同的错误。

\n\n

我试图从我的项目中解决我能找到的所有弃用警告。但无论如何,迁移错误仍然存​​在。任何人都可以看到任何可能的解决方案吗?谢谢 :-)

\n\n

设置.py:

\n\n
import os\nimport sys\nfrom json import loads\nprod_f = open(\'/etc/django-settings.json\', \'r\')\nprod_data = prod_f.read()\nprod_f.close()\njson_data = filter(lambda x: x[\'id\'] == \'mycms\', loads(prod_data))[0]\n\nSECRET_KEY = json_data[\'secretkey\']\n\nDATABASES = {\n    \'default\': {\n        \'ENGINE\': json_data[\'database\'][\'engine\'],\n        \'NAME\': json_data[\'database\'][\'name\'],\n        \'USER\': json_data[\'database\'][\'user\'],\n        \'PASSWORD\': json_data[\'database\'][\'pass\'],\n        \'HOST\': json_data[\'database\'][\'host\'],\n        \'PORT\': json_data[\'database\'][\'port\'],\n    },\n    \'backup\': {\n        \'ENGINE\': json_data[\'database\'][\'engine\'],\n        \'NAME\': \'tmpcms\',\n        \'USER\': json_data[\'database\'][\'user\'],\n        \'PASSWORD\': json_data[\'database\'][\'pass\'],\n        \'HOST\': json_data[\'database\'][\'host\'],\n        \'PORT\': json_data[\'database\'][\'port\'],\n    }\n}\nif \'test\' in sys.argv or \'test_coverage\' in sys.argv:  # Covers regular testing and django-coverage\n    DATABASES[\'default\'][\'ENGINE\'] = \'django.db.backends.sqlite3\'\n    DATABASES[\'backup\'][\'ENGINE\'] = \'django.db.backends.sqlite3\'\n\n# ### DEBUG AND ERROR REPORTING ###\nDEBUG = json_data[\'debug\']\nADMINS = json_data[\'admins\']\n\nSEND_BROKEN_LINK_EMAILS = json_data[\'debug_404\']\n\n\nSERVER_EMAIL = \'no-reply@example.com\'\n# ### END OF DEBUG AND ERROR REPORTING ###\n\nALLOWED_HOSTS = json_data[\'allowed_hosts\']\nINTERNAL_IPS = json_data[\'internal_ips\']\n\n\n# django-modeltranslation fallback\nMODELTRANSLATION_FALLBACK_LANGUAGES = (\'en\', \'nb\')\n\ngettext = lambda s: s\nPROJECT_PATH = os.path.abspath(os.path.dirname(__file__))\n\nfrom django.utils.translation import ugettext_lazy as _\n\nTEMPLATE_DEBUG = DEBUG\n\nMANAGERS = ADMINS\n\n# Local time zone for this installation. Choices can be found here:\n# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name\n# although not all choices may be available on all operating systems.\n# In a Windows environment this must be set to your system time zone.\nTIME_ZONE = \'Europe/Oslo\'\n\n# Language code for this installation. All choices can be found here:\n# http://www.i18nguy.com/unicode/language-identifiers.html\nLANGUAGE_CODE = \'en\'\n\nSITE_ID = 1\n\nUSE_I18N = True\nUSE_L10N = True\nUSE_TZ = True\n\nMEDIA_ROOT = os.path.join(PROJECT_PATH, "media")\nMEDIA_URL = "/media/"\nSTATIC_ROOT = os.path.join(PROJECT_PATH, "static")\nSTATIC_URL = \'/static/\'\n\n# URL where the users should be redirected to login.\n# https://docs.djangoproject.com/en/dev/ref/settings/#login-url\n# From #9820: missing link\nLOGIN_URL = \'/admin/\'\n\n# Additional locations of static files\nSTATICFILES_DIRS = (\n    # Put absolute paths here, like "/home/html/static" or "C:/www/django/static".\n)\n\n# List of finder classes that know how to find static files in\n# various locations.\nSTATICFILES_FINDERS = (\n    \'django.contrib.staticfiles.finders.FileSystemFinder\',\n    \'django.contrib.staticfiles.finders.AppDirectoriesFinder\',\n    #    \'django.contrib.staticfiles.finders.DefaultStorageFinder\',\n)\n\n# List of callables that know how to import templates from various sources.\nTEMPLATE_LOADERS = (\n    \'django.template.loaders.filesystem.Loader\',\n    \'django.template.loaders.app_directories.Loader\',\n    # \'django.template.loaders.eggs.Loader\',\n)\n\nMIDDLEWARE_CLASSES = (\n    \'django.middleware.cache.UpdateCacheMiddleware\',  # caching\n    \'django.contrib.sessions.middleware.SessionMiddleware\',\n    \'django.middleware.csrf.CsrfViewMiddleware\',\n    \'django.contrib.auth.middleware.AuthenticationMiddleware\',\n    \'django.contrib.messages.middleware.MessageMiddleware\',\n    \'django.middleware.locale.LocaleMiddleware\',\n    \'django.middleware.common.CommonMiddleware\',\n    \'django.middleware.doc.XViewMiddleware\',\n    \'django.middleware.clickjacking.XFrameOptionsMiddleware\',\n    \'cms.middleware.page.CurrentPageMiddleware\',\n    \'cms.middleware.user.CurrentUserMiddleware\',\n    \'cms.middleware.toolbar.ToolbarMiddleware\',\n    \'cms.middleware.language.LanguageCookieMiddleware\',\n    \'django.middleware.cache.FetchFromCacheMiddleware\',  # caching\n)\n\nTEMPLATE_CONTEXT_PROCESSORS = (\n    \'django.contrib.auth.context_processors.auth\',\n    \'django.core.context_processors.i18n\',\n    \'django.core.context_processors.request\',\n    \'django.core.context_processors.media\',\n    \'django.core.context_processors.static\',\n    \'cms.context_processors.cms_settings\',\n    \'sekizai.context_processors.sekizai\',\n    \'ga_tracking.context_processors.ga_tracking_id\',\n)\n\nfrom cms import __version__ as cms_version\nfrom djangocms_text_ckeditor import __version__ as cms_cked_v\nint_cms_v = map(int, cms_version.split(\'.\')[:1])\nint_cms_cked_v = map(int, cms_cked_v.split(\'.\')[:1])\nif int_cms_v[0] == 3:\n    if int_cms_cked_v[0] == 1:\n        raise RuntimeError(\'It seems that you are running django-cms v3.X. Please upgrade to djangocms_text_ckeditor>=v2\')\nelif int_cms_cked_v[0] > 1:\n    raise RuntimeError(\'It seems that you are running django-cms v3.X and djangocms_text_ckeditor>=v2. Please downgrade djangocms_text_ckeditor to v1.x.\')\n\n\nROOT_URLCONF = \'mycms.urls\'\n\n# Python dotted path to the WSGI application used by Django\'s runserver.\nWSGI_APPLICATION = \'mycms.wsgi.application\'\n\nTEMPLATE_DIRS = (\n    # Put absolute paths here, like "/home/html/django_templates" or "C:/www/django/templates".\n    os.path.join(PROJECT_PATH, "templates"),\n)\n\nimport re\nIGNORABLE_404_URLS = (\n    re.compile(r\'^/cms_search/\'),\n    re.compile(r\'/favicon.ico\'),\n    re.compile(r\'/\'),\n)\n\nCMS_TEMPLATES = (\n    # a bunch of templates\n)\n\nCMS_PERMISSION = True\n\nLANGUAGES = [\n    (\'nb\', _(\'Norwegian\')),\n    (\'en\', _(\'English\')),\n]\n\nCMS_LANGUAGES = {\n    1: [\n        {\n            \'code\': \'en\',\n            \'name\': \'English\',\n            \'fallbacks\': [\'nb\'],\n            \'public\': True,\n        },\n        {\n            \'code\': \'nb\',\n            \'name\': \'Norsk\',\n            \'public\': True,\n        }\n    ],\n    \'default\': {\n        \'fallbacks\': [\'en\', \'nb\'],\n        \'redirect_on_fallback\': True,\n        \'public\': False,\n        \'hide_untranslated\': False,\n    }\n}\n\nMIGRATION_MODULES = {\n    \'cms\': \'cms.migrations_django\',\n    \'menus\': \'menus.migrations_django\',\n}\n\n# South migration unit tests integration: deactivate\n# http://south.readthedocs.org/en/latest/unittests.html\nSOUTH_TESTS_MIGRATE = False\n\n# ###### django-guardian config #######\nAUTHENTICATION_BACKENDS = (\n    \'django.contrib.auth.backends.ModelBackend\',  # this is default\n    \'guardian.backends.ObjectPermissionBackend\',  # django-guardian object-specific backend\n)\n\nANONYMOUS_USER_ID = \'-1\'\n# ### END OF django-guardian config ###\n\nARCHIVE_PAGE_SIZE = 15\nDISABLE_LATEST_NEWS_PLUGIN = True\n\n# ###### LDAP CONFIG #######\nLDAP_SERVER = \'ldap://ldapproxy1.uib.no\'\nLDAP_USERNAME = LDAP_PASSWORD = \'\'\nLDAP_BASE_DN = \'dc=uib,dc=no\'\n# ### END OF LDAP CONFIG ###\n\n\n# ####### HAYSTACK CONFIG #######\nimport os\nHAYSTACK_CONNECTIONS = {\n    \'default\': {\n        \'ENGINE\': \'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine\',\n        \'URL\': \'http://127.0.0.1:9200/\',\n        \'INDEX_NAME\': \'haystack\',\n    }\n}\nHAYSTACK_SIGNAL_PROCESSOR = \'haystack.signals.RealtimeSignalProcessor\'\nHAYSTACK_CUSTOM_HIGHLIGHTER = \'utils.haystack_utils.StrongUniHighlighter\'\n# #### END OF HAYSTACK CONFIG ###\n\n# ###### EASY-THUMBNAILS CONFIG #######\nTHUMBNAIL_ALIASES = {\n    \'\': {\n        \'avatar_list\': {\'size\': (45, 80), \'crop\': \'scale\'},\n        \'avatar_department_list\': {\'size\': (45, 75), \'crop\': \'scale\'},\n        \'avatar_detail\': {\'size\': (185, 201), \'crop\': \'scale\'},\n        \'avatar_plugin\': {\'size\': (48, 76), \'crop\': \'scale\'},\n        \'news_small\': {\'size\': (300, 200), \'crop\': \'scale\'},\n        \'news_medium\': {\'size\': (364, 200), \'crop\': \'scale\'},\n        \'news_front_medium\': {\'size\': (252, 150), \'crop\': \'smart\'},\n        \'news_big\': {\'size\': (535, 354), \'crop\': \'scale\'},\n        \'share_linkedin\': {\'size\': (180, 110), \'crop\': \'smart\'},\n        \'share_facebook\': {\'size\': (600, 315), \'crop\': \'smart\'},\n        \'share_twitter\': {\'size\': (120, 120), \'crop\': \'smart\'},\n    }\n}\n\nSOUTH_MIGRATION_MODULES = {\n    \'easy_thumbnails\': \'easy_thumbnails.south_migrations\',\n}\n\n# The default quality level for JPG images on a scale from 1 (worst) to 95 (best).\n# Technically, values up to 100 are allowed, but this is not recommended.\n# http://easy-thumbnails.readthedocs.org/en/latest/ref/settings/#easy_thumbnails.conf.Settings.THUMBNAIL_QUALITY\nTHUMBNAIL_QUALITY = 85\n\n# ### END OF EASY-THUMBNAILS CONFIG ###\n\n# ### PIWIK STUFF, FOR MONITORING ###\nPIWIK_SITE_ID = 1\nPIWIK_URL = \'http://analytics.bccs.uib.no/\'\nGOOGLE_ANALYTICS_PROPERTY_ID = json_data[\'analytics_id\']\n# ####### END OF PIWIK STUFF ########\n\n# ###### GOOGLE ANALYTICS #######\nGA_TRACKING_ID = json_data[\'analytics_id\']\nGA_DOMAIN = \'uni.no\'\n# ### END OF GOOGLE ANALYTICS ###\n\nINSTALLED_APPS = (\n    \'django.contrib.auth\',\n    \'django.contrib.contenttypes\',\n    \'django.contrib.sessions\',\n    \'django.contrib.sites\',\n    \'django.contrib.messages\',\n    \'django.contrib.staticfiles\',\n    # Uncomment the next line to enable the admin:\n    \'django.contrib.admin\',\n    # Uncomment the next line to enable admin documentation:\n    # \'django.contrib.admindocs\',\n    \'django.contrib.sitemaps\',\n\n    \'modeltranslation\',\n\n    # django-cms\n    \'djangocms_text_ckeditor\',\n    \'cms\',\n    \'mptt\',\n    \'menus\',\n    \'sekizai\',\n\n\n    # django-cms optional plugins\n    \'djangocms_file\',\n    \'djangocms_link\',\n    \'djangocms_picture\',\n    \'easy_thumbnails\',  # requirement for djangocms_picture\n    #\'djangocms_text\', deactivated because of django-text-ckeditor\n    \'djangocms_video\',\n    # django-cms versioning\n    \'reversion\',\n    \'django_extensions\',\n    \'guardian\',\n    \'country_dialcode\',\n    \'ckeditor\',\n    \'ga_tracking\',\n    \'analytical\',\n    \'cookielaw\',\n\n    # django-haystack. Must be before custom apps\n    \'haystack\',\n\n    # custom developed modules\n    \'mycms\',\n    \'staff\',\n    \'project\',\n    \'department\',\n    \'group\',\n    \'research_area\',\n    \'topics\',\n    \'news\',\n    \'newsarchive\',\n    \'cms_search\',\n    \'manual_uploads\',\n)\nif \'test\' in sys.argv or \'test_coverage\' in sys.argv:\n    INSTALLED_APPS += filter(lambda app: app != \'djangocms_text_ckeditor\', INSTALLED_APPS)\nif DEBUG:\n    INSTALLED_APPS += (\'debug_toolbar\',)\n    DEBUG_TOOLBAR_PATCH_SETTINGS = False\n    MIDDLEWARE_CLASSES = (\n        \'django.middleware.cache.UpdateCacheMiddleware\',  # caching\n        \'django.contrib.sessions.middleware.SessionMiddleware\',\n        \'django.middleware.csrf.CsrfViewMiddleware\',\n        \'django.contrib.auth.middleware.AuthenticationMiddleware\',\n        \'django.contrib.messages.middleware.MessageMiddleware\',\n        \'django.middleware.locale.LocaleMiddleware\',\n        \'django.middleware.common.CommonMiddleware\',\n        \'django.middleware.doc.XViewMiddleware\',\n        \'django.middleware.clickjacking.XFrameOptionsMiddleware\',\n        \'cms.middleware.page.CurrentPageMiddleware\',\n        \'cms.middleware.user.CurrentUserMiddleware\',\n        \'cms.middleware.toolbar.ToolbarMiddleware\',\n        \'cms.middleware.language.LanguageCookieMiddleware\',\n        \'debug_toolbar.middleware.DebugToolbarMiddlewa

Tob*_*nst 5

modeltranslation请务必先阅读文档并注册django.contrib.admin。这为我解决了这个问题。

INSTALLED_APPS = (
    ...
    'modeltranslation',
    'django.contrib.admin',
    ....
)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。