Skip to content

Commit 08a698e

Browse files
committed
[1.1.X] Fixed #11465: Ensure nonexistent pks enterd in an admin raw id field do not
cause a server error. Thanks for report and initial patch [email protected]. Backport of r12648 from trunk. git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@12649 bcc190cf-cafb-0310-a4f2-bffc1f526a37
1 parent 5f70a72 commit 08a698e

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

django/contrib/admin/widgets.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,10 @@ def url_parameters(self):
148148

149149
def label_for_value(self, value):
150150
key = self.rel.get_related_field().name
151-
obj = self.rel.to._default_manager.get(**{key: value})
151+
try:
152+
obj = self.rel.to._default_manager.get(**{key: value})
153+
except self.rel.to.DoesNotExist:
154+
return ''
152155
return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
153156

154157
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):

tests/regressiontests/admin_widgets/tests.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,27 @@ def test_changelist_foreignkey(self):
130130
class OldAdminForeignKeyWidgetChangeList(AdminForeignKeyWidgetChangeList):
131131
urls = 'regressiontests.admin_widgets.urls2'
132132
admin_root = '/deep/down/admin'
133+
134+
class AdminForeignKeyRawIdWidget(DjangoTestCase):
135+
fixtures = ["admin-widgets-users.xml"]
136+
admin_root = '/widget_admin'
137+
138+
def setUp(self):
139+
self.client.login(username="super", password="secret")
140+
141+
def tearDown(self):
142+
self.client.logout()
143+
144+
def test_nonexistent_target_id(self):
145+
band = models.Band.objects.create(name='Bogey Blues')
146+
pk = band.pk
147+
band.delete()
148+
post_data = {
149+
"band": u'%s' % pk,
150+
}
151+
# Try posting with a non-existent pk in a raw id field: this
152+
# should result in an error message, not a server exception.
153+
response = self.client.post('%s/admin_widgets/event/add/' % self.admin_root,
154+
post_data)
155+
self.assertContains(response,
156+
'Select a valid choice. That choice is not one of the available choices.')

tests/regressiontests/admin_widgets/widgetadmin.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@ def formfield_for_foreignkey(self, db_field, request, **kwargs):
1919
return db_field.formfield(**kwargs)
2020
return super(CarTireAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
2121

22+
class EventAdmin(admin.ModelAdmin):
23+
raw_id_fields = ['band']
24+
2225
site = WidgetAdmin(name='widget-admin')
2326

2427
site.register(models.User)
2528
site.register(models.Car, CarAdmin)
2629
site.register(models.CarTire, CarTireAdmin)
30+
site.register(models.Event, EventAdmin)

0 commit comments

Comments
 (0)