Commit 1d485cf1 authored by Jannis Leidel's avatar Jannis Leidel
Browse files

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
parent 386b12c1
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -905,6 +905,10 @@ class ForeignKey(RelatedField, Field):

    def formfield(self, **kwargs):
        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 = {
            'form_class': forms.ModelChoiceField,
            'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to),
+33 −0
Original line number Diff line number Diff line
# -*- coding: utf-8 -*-
import datetime
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import models
from django.forms import Form, ModelForm, FileField, ModelChoiceField
from django.forms.models import ModelFormMetaclass
from django.test import TestCase
from regressiontests.forms.models import (ChoiceOptionModel, ChoiceFieldModel,
    FileModel, Group, BoundaryModel, Defaults)
@@ -160,3 +162,34 @@ class FormsModelTestCase(TestCase):
        self.assertEqual(obj.name, u'class default value')
        self.assertEqual(obj.value, 99)
        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))
+1 −1

File changed.

Contains only whitespace changes.