I recently upgraded to Django version 1.2.1 and I immediatelly noticed that some
of my models were broken with the following error:
C:\test>python manage.py syncdb
Traceback (most recent call last):
File "manage.py", line 11, in
execute_manager(settings)
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\core\management\__init__.py", line 438, in execute_manager
utility.execute()
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\core\management\__init__.py", line 379, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\core\management\base.py", line 191, in run_from_argv
self.execute(*args, **options.__dict__)
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\core\management\base.py", line 217, in execute
self.validate()
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\core\management\base.py", line 245, in validate
num_errors = get_validation_errors(s, app)
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\core\management\validation.py", line 28, in get_validation_errors
for (app_name, error) in get_app_errors().items():
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\db\models\loading.py", line 146, in get_app_errors
self._populate()
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\db\models\loading.py", line 61, in _populate
self.load_app(app_name, True)
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\db\models\loading.py", line 78, in load_app
models = import_module('.models', app_name)
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\utils\importlib.py", line 35, in import_module
__import__(name)
File "..\tso\blog\models.py", line 50, in
class Category(models.Model):
File "..\tso\blog\models.py", line 53, in Category
slug = models.SlugField(unique=True, prepopulate_from=('title',), help_text='Used in the category URL. Must be unique')
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\db\models\fields\__init__.py", line 988, in __init__
super(SlugField, self).__init__(*args, **kwargs)
File "C:\Python26\lib\site-packages\django-1.2.1-py2.6.egg\django\db\models\fields\__init__.py", line 542, in __init__
super(CharField, self).__init__(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'prepopulate_from'
So I did a little bit of research on this problem and I found the following
explanation for what is going on:
Changed prepopulate_from to be defined in the Admin class, not database field
classes
As of [4446], the prepopulate_from option to database fields no longer
exists. It's been discontinued in favor of the new prepopulated_fields option
on class Admin. The new prepopulated_fields option, if given, should be a
dictionary mapping field names to lists/tuples of field names. This change was
made in an effort to remove admin-specific options from the model
itself. Here's an example comparing old syntax and new syntax:
# OLD:
class MyModel(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
slug = models.CharField(max_length=60, prepopulate_from=('first_name', 'last_name'))
class Admin:
pass
# NEW:
class MyModel(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
slug = models.CharField(max_length=60)
from django.contrib import admin
class MyModelAdmin(admin.ModelAdmin):
prepopulated_fields = {'slug': ('first_name', 'last_name')}
admin.site.register(MyModel, MyModelAdmin)
The above is taken from the Django wiki page that talks about the
newforms-admin branch.