From 43c8d4d35c787a4f2f9afc46a53ea002ff54f76a Mon Sep 17 00:00:00 2001
From: Jonas Obrist <jonas.obrist@divio.ch>
Date: Thu, 9 Jun 2011 23:35:52 +0200
Subject: [PATCH] Fixed 10405 by raising a more useful exception
---
django/core/exceptions.py | 2 +-
django/db/models/fields/related.py | 3 ++
tests/regressiontests/forms/tests/models.py | 34 ++++++++++++++++++++++++++-
3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/django/core/exceptions.py b/django/core/exceptions.py
index 21be870..201a854 100644
a
|
b
|
Global Django exception and warning classes.
|
3 | 3 | """ |
4 | 4 | |
5 | 5 | class DjangoRuntimeWarning(RuntimeWarning): |
6 | | pass |
| 6 | pass |
7 | 7 | |
8 | 8 | class ObjectDoesNotExist(Exception): |
9 | 9 | "The requested object does not exist" |
diff --git a/django/db/models/fields/related.py b/django/db/models/fields/related.py
index cedf308..8321f15 100644
a
|
b
|
class ForeignKey(RelatedField, Field):
|
907 | 907 | |
908 | 908 | def formfield(self, **kwargs): |
909 | 909 | db = kwargs.pop('using', None) |
| 910 | if isinstance(self.rel.to, basestring): |
| 911 | raise ValueError("Cannot create form field for %r yet, because " |
| 912 | "its related model %r has not been loaded yet" % (self.name, self.rel.to)) |
910 | 913 | defaults = { |
911 | 914 | 'form_class': forms.ModelChoiceField, |
912 | 915 | 'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to), |
diff --git a/tests/regressiontests/forms/tests/models.py b/tests/regressiontests/forms/tests/models.py
index 3f548df..d84d334 100644
a
|
b
|
|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | import datetime |
3 | 3 | from django.core.files.uploadedfile import SimpleUploadedFile |
| 4 | from django.db import models |
| 5 | from django.forms.models import ModelForm, ModelFormMetaclass |
4 | 6 | from django.forms import Form, ModelForm, FileField, ModelChoiceField |
5 | 7 | from django.test import TestCase |
6 | 8 | from regressiontests.forms.models import ChoiceModel, ChoiceOptionModel, ChoiceFieldModel, FileModel, Group, BoundaryModel, Defaults |
7 | 9 | |
8 | | |
9 | 10 | class ChoiceFieldForm(ModelForm): |
10 | 11 | class Meta: |
11 | 12 | model = ChoiceFieldModel |
… |
… |
class FormsModelTestCase(TestCase):
|
159 | 160 | self.assertEqual(obj.name, u'class default value') |
160 | 161 | self.assertEqual(obj.value, 99) |
161 | 162 | self.assertEqual(obj.def_date, datetime.date(1999, 3, 2)) |
| 163 | |
| 164 | class RelatedModelFormTests(TestCase): |
| 165 | def test_invalid_loading_order(self): |
| 166 | """ |
| 167 | Test for issue 10405 |
| 168 | """ |
| 169 | class A(models.Model): |
| 170 | ref = models.ForeignKey("B") |
| 171 | |
| 172 | class Meta: |
| 173 | model=A |
| 174 | |
| 175 | self.assertRaises(ValueError, ModelFormMetaclass, 'Form', (ModelForm,), {'Meta': Meta}) |
| 176 | |
| 177 | class B(models.Model): |
| 178 | pass |
| 179 | |
| 180 | def test_valid_loading_order(self): |
| 181 | """ |
| 182 | Test for issue 10405 |
| 183 | """ |
| 184 | class A(models.Model): |
| 185 | ref = models.ForeignKey("B") |
| 186 | |
| 187 | class B(models.Model): |
| 188 | pass |
| 189 | |
| 190 | class Meta: |
| 191 | model=A |
| 192 | |
| 193 | self.assertTrue(issubclass(ModelFormMetaclass('Form', (ModelForm,), {'Meta': Meta}), ModelForm)) |