Commit b3b84223 authored by Malcolm Tredinnick's avatar Malcolm Tredinnick
Browse files

Fixed #6445 -- Allow model instances to be used as a default for ForeignKeys

(via a callable). Also updates the documentation of the "default" attribute to
indicate a callable can be used. Thanks, Philipe Raoult.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@7331 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 597f9d61
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -548,6 +548,13 @@ class ForeignKey(RelatedField, Field):
            params['choices'] = self.get_choices_default()
        return field_objs, params

    def get_default(self):
        "Here we check if the default value is an object and return the to_field if so."
        field_default = super(ForeignKey, self).get_default()
        if isinstance(field_default, self.rel.to):
            return getattr(field_default, self.rel.get_related_field().attname)
        return field_default

    def get_manipulator_field_objs(self):
        rel_field = self.rel.get_related_field()
        if self.rel.raw_id_admin and not isinstance(rel_field, AutoField):
+2 −1
Original line number Diff line number Diff line
@@ -626,7 +626,8 @@ option is ignored.
``default``
~~~~~~~~~~~

The default value for the field.
The default value for the field. This can be a value or a callable object. If
callable it will be called every time a new object is created.

``editable``
~~~~~~~~~~~~
+24 −0
Original line number Diff line number Diff line

from django.db import models

class Foo(models.Model):
    a = models.CharField(max_length=10)

def get_foo():
    return Foo.objects.get(id=1)

class Bar(models.Model):
    b = models.CharField(max_length=10)
    a = models.ForeignKey(Foo, default=get_foo)

__test__ = {'API_TESTS':"""
# Create a couple of Places.
>>> f = Foo.objects.create(a='abc')
>>> f.id
1
>>> b = Bar(b = "bcd")
>>> b.a
<Foo: Foo object>
>>> b.save()

"""}