Ошибка django: "Поймано уже зарегистрировано"? Только зарегистрированные модели один раз - PullRequest
2 голосов
/ 02 марта 2012

Я получаю эту ошибку в моей среде разработки. Я потратил слишком много времени, пытаясь понять это, особенно потому, что я представляю, что это смотрит мне в лицо. Я создал новую ModelForm для одной из моих моделей, а затем начал получать эту ошибку. Он исчезнет, ​​если я закомментирую строки «admin.site.register (ModelName)» в моем файле models.py, но тогда я больше не смогу проверить данные на сайте администратора ...

Вот ошибка:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/admin/

Django Version: 1.3.1
Python Version: 2.7.2
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'azcerts.certmanager']
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.middleware.csrf.CsrfResponseMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
  101.                             request.path_info)
File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in resolve
  250.             for pattern in self.url_patterns:
File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in _get_url_patterns
  279.         patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
File "C:\Python27\lib\site-packages\django\core\urlresolvers.py" in _get_urlconf_module
  274.             self._urlconf_module = import_module(self.urlconf_name)
File "C:\Python27\lib\site-packages\django\utils\importlib.py" in import_module
  35.     __import__(name)
File "C:\Users\ntagg\Code\azcerts\urls.py" in <module>
  3. from certmanager.views import addone
File "C:\Users\ntagg\Code\azcerts\certmanager\views.py" in <module>
  4. from forms import CertForm
File "C:\Users\ntagg\Code\azcerts\forms.py" in <module>
  4. from certmanager.models import UserProfile, Cert
File "C:\Users\ntagg\Code\azcerts\certmanager\models.py" in <module>
  52. admin.site.register(UserProfile)
File "C:\Python27\lib\site-packages\django\contrib\admin\sites.py" in register
  85.                 raise AlreadyRegistered('The model %s is already registered' % model.__name__)

Exception Type: AlreadyRegistered at /admin/
Exception Value: The model UserProfile is already registered

Вот модели.py:

#models.py
from django.db import models
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.localflavor.us.models import USStateField

class Cert(models.Model):
    # My fields are here...

    def __unicode__(self):
        return self.fieldname

class UserProfile(models.Model):
    # My fields are here...

    def __unicode__(self):
        return self.fieldname

admin.site.register(UserProfile)
admin.site.register(Cert)

1 Ответ

5 голосов
/ 02 марта 2012

Не регистрируйте свои модели в своем models.py, создайте admin.py для своего приложения и делайте это там.

# admin.py
from django.contrib import admin
from myapp.models import Cert, UserProfile 
admin.site.register(Cert)
admin.site.register(UserProfile)

Пояснение:

Когда вы создавали форму модели, Django дважды импортировал ваш models.py: один раз с путем azcerts.certmanager.models (как в вашем INSTALLED_APPS) и снова с путем certmanager.models (в модуле, где вы определить форму модели). Во второй раз, когда Django импортировал models.py, он попытался снова зарегистрировать модели и выдал ошибку.

Перемещая команды регистрации в admin.py, вы гарантируете, что модели будут зарегистрированы только один раз.

Немного запутанно, что models.py можно импортировать по двум разным путям, как это. Макет проекта по умолчанию изменился в Django 1.4, что предотвратит подобные ошибки.

...