diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 696dd30387..9eaa9e5851 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -503,7 +503,17 @@ class ModelAdmin(BaseModelAdmin): self.log_addition(request, new_object) return self.response_add(request, new_object) else: - form = ModelForm(initial=dict(request.GET.items())) + # Prepare the dict of initial data from the request. + # We have to special-case M2Ms as a list of comma-separated PKs. + initial = dict(request.GET.items()) + for k in initial: + try: + f = opts.get_field(k) + except FieldDoesNotExist: + pass + if isinstance(f, models.ManyToManyField): + initial[k] = initial[k].split(",") + form = ModelForm(initial=initial) for FormSet in self.get_formsets(request): formset = FormSet(instance=self.model()) formsets.append(formset) diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py index c0cc94599d..d16889f45a 100644 --- a/tests/regressiontests/admin_views/tests.py +++ b/tests/regressiontests/admin_views/tests.py @@ -36,6 +36,14 @@ class AdminViewBasicTest(TestCase): response = self.client.get('/test_admin/admin/admin_views/section/add/') self.failUnlessEqual(response.status_code, 200) + def testAddWithGETArgs(self): + response = self.client.get('/test_admin/admin/admin_views/section/add/', {'name': 'My Section'}) + self.failUnlessEqual(response.status_code, 200) + self.failUnless( + 'value="My Section"' in response.content, + "Couldn't find an input with the right value in the response." + ) + def testBasicEditGet(self): """ A smoke test to ensureGET on the change_view works.