summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--django/contrib/admin/helpers.py24
-rw-r--r--django/contrib/admin/views/main.py2
-rw-r--r--django/forms/models.py2
-rw-r--r--tests/regressiontests/admin_views/models.py2
-rw-r--r--tests/regressiontests/model_forms_regress/models.py2
5 files changed, 27 insertions, 5 deletions
diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py
index 5cb8f1f07b..9312eab94f 100644
--- a/django/contrib/admin/helpers.py
+++ b/django/contrib/admin/helpers.py
@@ -17,7 +17,7 @@ checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False)
class AdminForm(object):
def __init__(self, form, fieldsets, prepopulated_fields):
- self.form, self.fieldsets = form, fieldsets
+ self.form, self.fieldsets = form, normalize_fieldsets(fieldsets)
self.prepopulated_fields = [{
'field': form[field_name],
'dependencies': [form[f] for f in dependencies]
@@ -196,3 +196,25 @@ class AdminErrorList(forms.util.ErrorList):
self.extend(inline_formset.non_form_errors())
for errors_in_inline_form in inline_formset.errors:
self.extend(errors_in_inline_form.values())
+
+def normalize_fieldsets(fieldsets):
+ """
+ Make sure the keys in fieldset dictionaries are strings. Returns the
+ normalized data.
+ """
+ result = []
+ for name, options in fieldsets:
+ result.append((name, normalize_dictionary(options)))
+ return result
+
+def normalize_dictionary(data_dict):
+ """
+ Converts all the keys in "data_dict" to strings. The keys must be
+ convertible using str().
+ """
+ for key, value in data_dict.items():
+ if not isinstance(key, str):
+ del data_dict[key]
+ data_dict[str(key)] = value
+ return data_dict
+
diff --git a/django/contrib/admin/views/main.py b/django/contrib/admin/views/main.py
index 9580e912a4..49b18ebdfd 100644
--- a/django/contrib/admin/views/main.py
+++ b/django/contrib/admin/views/main.py
@@ -228,7 +228,7 @@ class ChangeList(object):
if self.search_fields and self.query:
for bit in self.query.split():
- or_queries = [models.Q(**{construct_search(field_name): bit}) for field_name in self.search_fields]
+ or_queries = [models.Q(**{construct_search(str(field_name)): bit}) for field_name in self.search_fields]
other_qs = QuerySet(self.model)
other_qs.dup_select_related(qs)
other_qs = other_qs.filter(reduce(operator.or_, or_queries))
diff --git a/django/forms/models.py b/django/forms/models.py
index 8d55e4459e..010d3bf61c 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -276,7 +276,7 @@ class BaseModelForm(BaseForm):
# using it in a lookup.
if isinstance(self.fields[field_name], ModelChoiceField):
lookup_value = lookup_value.pk
- lookup_kwargs[field_name] = lookup_value
+ lookup_kwargs[str(field_name)] = lookup_value
qs = self.instance.__class__._default_manager.filter(**lookup_kwargs)
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index 75b4ad2c87..f1c24c2e99 100644
--- a/tests/regressiontests/admin_views/models.py
+++ b/tests/regressiontests/admin_views/models.py
@@ -169,7 +169,7 @@ class PersonAdmin(admin.ModelAdmin):
list_display = ('name', 'gender', 'alive')
list_editable = ('gender', 'alive')
list_filter = ('gender',)
- search_fields = ('name',)
+ search_fields = (u'name',)
ordering = ["id"]
class Persona(models.Model):
diff --git a/tests/regressiontests/model_forms_regress/models.py b/tests/regressiontests/model_forms_regress/models.py
index 88e23f9013..a8bd0a3fff 100644
--- a/tests/regressiontests/model_forms_regress/models.py
+++ b/tests/regressiontests/model_forms_regress/models.py
@@ -11,7 +11,7 @@ class Triple(models.Model):
return u"%d, %d, %d" % (self.left, self.middle, self.right)
class Meta:
- unique_together = (('left', 'middle'), ('middle', 'right'))
+ unique_together = (('left', 'middle'), (u'middle', u'right'))
class FilePathModel(models.Model):
path = models.FilePathField(path=os.path.dirname(__file__), match=".*\.py$", blank=True)