Why are you creating two groups of tags ? Why not use a specific widgets 
like a tree widget ?

On Monday, January 14, 2013 12:02:59 PM UTC+1, Sammael wrote:
>
> *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.
>

I think that it would be useful. maybe try widgets 
attrs<https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-field-types-or-widgets>
 

>
> *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 =(
>

Are you sure you use the good parameter to pass the queryset to the 
underlying Field

An hack that could probably work is the create a copy the tags field into a 
tags_2 field in class model definition but it's kind of ugly ;)

-- 
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/-/Yhb4jjBRFeQJ.
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