Skip to content

Commit e4bd5e8

Browse files
committed
[1.2.X] Fixed #13149 -- The admin ForeignKeyRawIdWidget now properly handles non-integer values. Thanks, Chris Adams.
Backport of r13751 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.2.X@13752 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent f4ebd70 commit e4bd5e8

File tree

3 files changed

+16
-4
lines changed

3 files changed

+16
-4
lines changed

django/contrib/admin/widgets.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -154,9 +154,9 @@ def label_for_value(self, value):
154154
key = self.rel.get_related_field().name
155155
try:
156156
obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
157-
except self.rel.to.DoesNotExist:
157+
return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
158+
except (ValueError, self.rel.to.DoesNotExist):
158159
return ''
159-
return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
160160

161161
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
162162
"""
@@ -169,7 +169,7 @@ def __init__(self, rel, attrs=None, using=None):
169169
def render(self, name, value, attrs=None):
170170
attrs['class'] = 'vManyToManyRawIdAdminField'
171171
if value:
172-
value = ','.join([str(v) for v in value])
172+
value = ','.join([force_unicode(v) for v in value])
173173
else:
174174
value = ''
175175
return super(ManyToManyRawIdWidget, self).render(name, value, attrs)

django/forms/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,7 @@ def to_python(self, value):
996996
try:
997997
key = self.to_field_name or 'pk'
998998
value = self.queryset.get(**{key: value})
999-
except self.queryset.model.DoesNotExist:
999+
except (ValueError, self.queryset.model.DoesNotExist):
10001000
raise ValidationError(self.error_messages['invalid_choice'])
10011001
return value
10021002

tests/regressiontests/admin_widgets/tests.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# encoding: utf-8
2+
13
from django import forms
24
from django.contrib import admin
35
from django.contrib.admin import widgets
@@ -151,3 +153,13 @@ def test_nonexistent_target_id(self):
151153
post_data)
152154
self.assertContains(response,
153155
'Select a valid choice. That choice is not one of the available choices.')
156+
157+
def test_invalid_target_id(self):
158+
159+
for test_str in ('Iñtërnâtiônàlizætiøn', "1234'", -1234):
160+
# This should result in an error message, not a server exception.
161+
response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root,
162+
{"band": test_str})
163+
164+
self.assertContains(response,
165+
'Select a valid choice. That choice is not one of the available choices.')

0 commit comments

Comments
 (0)