Commit f219136e authored by Brian Rosner's avatar Brian Rosner
Browse files

[1.0.X] Fixed #9498 -- Handle a formset correctly when the foreign key is not available (for now).

This case pops up with generic foreign key inlines after [9297]. Added tests
to handle future regressions with generic foreign key inlines in the admin.

Thanks markus and danielr for patches.

Backport of [9412] from trunk.

git-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9413 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent c8dcbb03
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -108,8 +108,9 @@ class InlineAdminFormSet(object):
            yield InlineAdminForm(self.formset, form, self.fieldsets, self.opts.prepopulated_fields, None)

    def fields(self):
        fk = getattr(self.formset, "fk", None)
        for field_name in flatten_fieldsets(self.fieldsets):
            if self.formset.fk.name == field_name:
            if fk and fk.name == field_name:
                continue
            yield self.formset.form.base_fields[field_name]

@@ -150,7 +151,11 @@ class InlineAdminForm(AdminForm):
        return AdminField(self.form, self.formset._pk_field.name, False)
    
    def fk_field(self):
        return AdminField(self.form, self.formset.fk.name, False)
        fk = getattr(self.formset, "fk", None)
        if fk:
            return AdminField(self.form, fk.name, False)
        else:
            return ""

    def deletion_field(self):
        from django.forms.formsets import DELETION_FIELD_NAME
@@ -166,8 +171,9 @@ class InlineFieldset(Fieldset):
        super(InlineFieldset, self).__init__(*args, **kwargs)
        
    def __iter__(self):
        fk = getattr(self.formset, "fk", None)
        for field in self.fields:
            if self.formset.fk.name == field:
            if fk and fk.name == field:
                continue
            yield Fieldline(self.form, field)
            
+0 −0

Empty file added.

+11 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
    <object pk="1" model="generic_inline_admin.Episode">
        <field type="CharField" name="name">This Week in Django</field>
    </object>
    <object pk="1" model="generic_inline_admin.Media">
        <field type="ForeignKey" name="content_type">13</field>
        <field type="PositiveIntegerField" name="object_id">1</field>
        <field type="URLField" name="url">http://example.com/podcast.mp3</field>
    </object>
</django-objects>
 No newline at end of file
+17 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<django-objects version="1.0">
    <object pk="100" model="auth.user">
        <field type="CharField" name="username">super</field>
        <field type="CharField" name="first_name">Super</field>
        <field type="CharField" name="last_name">User</field>
        <field type="CharField" name="email">super@example.com</field>
        <field type="CharField" name="password">sha1$995a3$6011485ea3834267d719b4c801409b8b1ddd0158</field>
        <field type="BooleanField" name="is_staff">True</field>
        <field type="BooleanField" name="is_active">True</field>
        <field type="BooleanField" name="is_superuser">True</field>
        <field type="DateTimeField" name="last_login">2007-05-30 13:20:10</field>
        <field type="DateTimeField" name="date_joined">2007-05-30 13:20:10</field>
        <field to="auth.group" name="groups" rel="ManyToManyRel"></field>
        <field to="auth.permission" name="user_permissions" rel="ManyToManyRel"></field>
    </object>
</django-objects>
 No newline at end of file
+30 −0
Original line number Diff line number Diff line
from django.db import models
from django.contrib import admin
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType

class Episode(models.Model):
    name = models.CharField(max_length=100)

class Media(models.Model):
    """
    Media that can associated to any object.
    """
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()
    url = models.URLField(verify_exists=False)

    def __unicode__(self):
        return self.url

class MediaInline(generic.GenericTabularInline):
    model = Media
    extra = 1
    
class EpisodeAdmin(admin.ModelAdmin):
    inlines = [
        MediaInline,
    ]

admin.site.register(Episode, EpisodeAdmin)
Loading