Kaydet (Commit) 1d485cf1 authored tarafından Jannis Leidel's avatar Jannis Leidel

Fixed #10405 -- Raise a more useful error if the formfield of a related model…

Fixed #10405 -- Raise a more useful error if the formfield of a related model field can't be created yet because the related model isn't loaded yet. Thanks ojii and charstring.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@16604 bcc190cf-cafb-0310-a4f2-bffc1f526a37
üst 386b12c1
...@@ -3,7 +3,7 @@ Global Django exception and warning classes. ...@@ -3,7 +3,7 @@ Global Django exception and warning classes.
""" """
class DjangoRuntimeWarning(RuntimeWarning): class DjangoRuntimeWarning(RuntimeWarning):
pass pass
class ObjectDoesNotExist(Exception): class ObjectDoesNotExist(Exception):
"The requested object does not exist" "The requested object does not exist"
......
...@@ -905,6 +905,10 @@ class ForeignKey(RelatedField, Field): ...@@ -905,6 +905,10 @@ class ForeignKey(RelatedField, Field):
def formfield(self, **kwargs): def formfield(self, **kwargs):
db = kwargs.pop('using', None) db = kwargs.pop('using', None)
if isinstance(self.rel.to, basestring):
raise ValueError("Cannot create form field for %r yet, because "
"its related model %r has not been loaded yet" %
(self.name, self.rel.to))
defaults = { defaults = {
'form_class': forms.ModelChoiceField, 'form_class': forms.ModelChoiceField,
'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to), 'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to),
......
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime import datetime
from django.core.files.uploadedfile import SimpleUploadedFile from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import models
from django.forms import Form, ModelForm, FileField, ModelChoiceField from django.forms import Form, ModelForm, FileField, ModelChoiceField
from django.forms.models import ModelFormMetaclass
from django.test import TestCase from django.test import TestCase
from regressiontests.forms.models import (ChoiceOptionModel, ChoiceFieldModel, from regressiontests.forms.models import (ChoiceOptionModel, ChoiceFieldModel,
FileModel, Group, BoundaryModel, Defaults) FileModel, Group, BoundaryModel, Defaults)
...@@ -160,3 +162,34 @@ class FormsModelTestCase(TestCase): ...@@ -160,3 +162,34 @@ class FormsModelTestCase(TestCase):
self.assertEqual(obj.name, u'class default value') self.assertEqual(obj.name, u'class default value')
self.assertEqual(obj.value, 99) self.assertEqual(obj.value, 99)
self.assertEqual(obj.def_date, datetime.date(1999, 3, 2)) self.assertEqual(obj.def_date, datetime.date(1999, 3, 2))
class RelatedModelFormTests(TestCase):
def test_invalid_loading_order(self):
"""
Test for issue 10405
"""
class A(models.Model):
ref = models.ForeignKey("B")
class Meta:
model=A
self.assertRaises(ValueError, ModelFormMetaclass, 'Form', (ModelForm,), {'Meta': Meta})
class B(models.Model):
pass
def test_valid_loading_order(self):
"""
Test for issue 10405
"""
class A(models.Model):
ref = models.ForeignKey("B")
class B(models.Model):
pass
class Meta:
model=A
self.assertTrue(issubclass(ModelFormMetaclass('Form', (ModelForm,), {'Meta': Meta}), ModelForm))
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment