Using multiple forms to manage a model under admin

723 views
Skip to first unread message

Eiji Kobayashi

unread,
Jun 21, 2011, 6:16:22 PM6/21/11
to django...@googlegroups.com
Hello,

I have a question for all you django wizards. I want to use different forms for managing a model in Django's admin. I thought it's common problem, but I cannot find a good solution even after reading through google, stackoverflow and django's source code. (My apologies if this is a often asked newbie question).

For example, I have a model like this:

# users/models.py
...
REG_STATUS_TYPE = (
        ( 'queued', 'Queued' ),
        ( 'sent', 'Sent' ),
        ( 'accepted', 'Accepted' ),
        ( 'declined', 'Declined' ),
        ( 'blocked', 'Blocked' ),
    )
class RegistrationQueue(models.Model):
  user = models.ForeignKey(User)
  created = models.DateTimeField(default=datetime.datetime.now, editable=False)
  status = models.CharField(max_length=10, choices=REG_STATUS_TYPE, default='queued')
  accepted = models.DateTimeField(editable=False, null=True)
...

# users/admin.py
...
class RegistrationViewForm(models.ModelForm):
  class Meta:
    model = RegistrationQueue

class RegistrationAddForm(models.ModelForm):
  class Meta:
    model = User

class RegistrationQueueAdmin(admin.ModelAdmin):
    add_form = RegistrationAddForm
    view_form = RegistrationViewForm

    def get_form(self, request, obj=None, **kwargs):
        defaults = {}
        if obj is None:
            defaults.update({
                'form': self.add_form,
            })
        else:
            defaults.update({
                'form': self.view_form
            })
        defaults.update(kwargs)
        return super(RegistrationAdmin, self).get_form(request, obj, **defaults)
admin.site.register(RegistrationQueue, RegistrationQueueAdmin)

What I'm trying to do is simple really. When creating a new RegistrationQueue entry, I would like Django's admin to use a form derived from the User model (which would let me create a temporary user, and then I can take some of the information from that and other things to automatically create a RegistrationQueue entry).

However, when listing or changing the RegistrationQueue, I would like to use a form derived from the RegistrationQueue model.

So, as you can see above, I tried to replace ModelAdmin's get_form method with a custom one that just checks the incoming obj variable. If it's set to None, I know it's trying a create a new entry. Otherwise, it's something else.

The problem is that the admin always uses the form derived from the RegistrationQueue, and never the User. Whenever I click to add a RegistrationQueue, I get a form with fields belonging to the RegistrationQueue model.

Please tell me what I'm doing wrong. Thank you very much in advance.

Eiji
Reply all
Reply to author
Forward
0 new messages