Adding a ManyToManyWidget to the reverse of a ManyToManyField in the Django Admin

前端 未结 5 1065
我寻月下人不归
我寻月下人不归 2020-12-13 07:08

Let\'s say I have a simple blog app in Django 1.4:

class Post(models.Model):
    title = …
    published_on = …
    tags = models.ManyToManyField(\'Tag\')

c         


        
5条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-13 07:17

    This is possible to do with a custom form.

    from django.contrib import admin
    from django import forms
    
    from models import Post, Tag
    
    class PostAdminForm(forms.ModelForm):
        tags = forms.ModelMultipleChoiceField(
            Tag.objects.all(),
            widget=admin.widgets.FilteredSelectMultiple('Tags', False),
            required=False,
        )
    
        def __init__(self, *args, **kwargs):
            super(PostAdminForm, self).__init__(*args, **kwargs)
            if self.instance.pk:
                self.initial['tags'] = self.instance.tags.values_list('pk', flat=True)
    
        def save(self, *args, **kwargs):
            instance = super(PostAdminForm, self).save(*args, **kwargs)
            if instance.pk:
                instance.tags.clear()
                instance.tags.add(*self.cleaned_data['tags'])
            return instance
    
    class PostAdmin(admin.ModelAdmin):
        form = PostAdminForm
    
    admin.site.register(Post, PostAdmin)
    

    That False in there can be replaced with a True if you want vertically stacked widget.

提交回复
热议问题