*The models*

    class TagGroup(models.Model):
        name = models.SlugField(max_length=50, unique=True, db_index=True)

    class Tag(models.Model):
        name = models.SlugField(max_length=50, unique=True, db_index=True)
        group = models.ForeignKey(TagGroup)
        def __unicode__(self):
            return self.name

    class Album(models.Model):
        name = models.CharField(max_length=64, blank=True)
        tags = models.ManyToManyField(Tag, blank=True)
*The idea* is to have some groups of tags, for example, season (with the 
following tags: winter, summer, etc.) and place (with tags like Europe, 
America) for each album.
*The problem* is I can't find a way to have a separate form for each group of 
tags in Django Admin.

I've been reading docs for many hours trying to find the solution and here is 
where I come.

*First approach*

First of all I decided to create a separate form for tags:

    class AlbumAdminForm(forms.ModelForm):
        class Meta:
            model = Album
        tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.all(), 
required=False, widget=FilteredSelectMultiple('tags', False ))

    class AlbumAdmin(admin.ModelAdmin):
        form = AlbumAdminForm

It works good. Trying to add another form like this:

    class AlbumAdminForm(forms.ModelForm):
        class Meta:
            model = Album
        tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.filter(group 
= 1), required=False, widget=FilteredSelectMultiple('tags', False ))
        tags_2 = 
forms.ModelMultipleChoiceField(queryset=Tag.objects.filter(group = 2), 
required=False, widget=FilteredSelectMultiple('tags', False ))

In this case I see two forms in django admin with tags I can select, but can't 
save the contents of the second form because of it's property name 'tags_2' - 
django relies on this name. Unfortunately, I didn't find any way to make this 
form use Album.tags to save it's values.
*Second approach*

As far as I couldn't find the right way with AlbumAdminForm itself I decided to 
change html code it generates. First form looks like this:

    <select multiple="multiple" class="selectfilter" name="tags" id="id_tags">
    </select><script type="text/javascript">
        addEvent(window, "load", function(e) {SelectFilter.init("id_tags", 
"tags", 0, "/static/admin/"); });
    </script>

I was trying to make the second one as similar as possible, but the only thing 
I could change is it's id:


    class AlbumAdminForm(forms.ModelForm):
        class Meta:
            model = Album
        tags = forms.ModelMultipleChoiceField(queryset=Tag.objects.filter(group 
= 1), required=False, widget=FilteredSelectMultiple('tags', False ))
        tags_2 = 
forms.ModelMultipleChoiceField(queryset=Tag.objects.filter(group = 2), 
required=False, widget=FilteredSelectMultiple('tags', False ))
        def __init__(self, *args, **kwargs):
            super(AlbumAdminForm, self).__init__(*args, **kwargs)
            self.fields['tags_2'].widget.attrs['id'] = 'id_tags'

I couldn't change it's name or 'SelectFilter.init' call. Don't know if it would 
be any useful if I could. So, still no luck.
*Third approach*

Trying to use MultiWidget and MultiValueField:

    class My(object):
        def __init__(self, val1=EmptyQuerySet(), val2=EmptyQuerySet):
            self.val1=val1
            self.val2=val2

    class MyWidget(widgets.MultiWidget):
        def __init__(self, attrs=None):
            widget = (
               FilteredSelectMultiple('tags1', False),
               FilteredSelectMultiple('tags2', False)
               )
            super(MyWidget, self).__init__(widget, attrs=attrs)
        def decompress(self,value):
            if value:
                return value.val1 + value.val2
            return None

    class MyField(forms.MultiValueField):
        widget = MyWidget
        def __init__(self, required=True, widget=None, label=None, 
initial=None, help_text=None, queryset=None):
            field = (
                 ModelMultipleChoiceField(queryset=queryset),
                 ModelMultipleChoiceField(queryset=queryset)
                 ) 
            super(MyField, self).__init__(fields=field, widget=widget, 
label=label, initial=initial, help_text=help_text)

    class AlbumAdminForm(forms.ModelForm):
        class Meta:
            model = Album
        tags = MyField(queryset=Tag.objects.all())

In this case I have two forms but both are empty, I have nothing to choose. No 
luck =(


Could you please help me to resolve this issue? Any help would be greatly 
appreciated.

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/django-users/-/ltYHUSWSK14J.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to