Alex Kuhl
Alex Kuhl

Reputation: 1824

Django: "reverse" many-to-many relationships on forms

The easiest example of the sort of relationship I'm talking about is that between Django's Users and Groups. The User table has a ManyToMany field as part of its definition and the Group table is the "reverse" side.

A note about my constraints: I am not working with the Admin interface at all nor is that an option.

Now, onto the programming problem. I need to write a form that is used to edit MyGroup instances, defined simply as the following:

class MyGroup( Group ):
  some_field = models.CharField( max_length=50 )

I want to be able to have a form page where I can edit both some_field and which users are members of the group. Because I'm working with a model, a ModelForm seems obvious. But I cannot figure out how to get Django to include the users because it is on the reverse side of the User-Group relationship. Ideally, I'd like the display widget for specifying the users to be like the one for specifying permissions that is found on the User and Group pages within Admin.

Upvotes: 3

Views: 1392

Answers (2)

Alex Kuhl
Alex Kuhl

Reputation: 1824

I never found a great way to do this. I ended up writing custom forms that manage creating the fields and specifying an appropriate queryset on them.

For the display portion of the question, there is a way to use the SelectFilter (a.k.a. horizontal filter) on regular pages. One page with instructions I found is here, and there was another that was helpful, but I can't seem to re-located it.

I'm considering writing up a more thorough guide to both parts of this process. If anyone is interested please let me know, it'll give me the push to actually get it done.

Upvotes: 0

Thomas Kremmel
Thomas Kremmel

Reputation: 14783

inline-formsets

do the trick for a foreign key relationship.

 GroupUserInlineFormSet = inlineformset_factory(MyGroup, User, form=PurchaseOrderEditForm, max_num=100, extra=2, can_delete=False)

 guformset = GroupUserInlineFormSet (instance=mygroup)

might point you in the right direction. not sure how this can work with a manytomany relationship.

Upvotes: 1

Related Questions