在Django管理筛选多对多箱(Filter ManyToMany box in Django Ad

2019-06-27 19:04发布

我与另一个对象的许多一对多关系的对象。
在Django管理这导致在多选择框一个很长的名单。

我想过滤的多对多关系,所以我只取分类可用在城市的客户选择。

这可能吗? 我将不得不为它创建一个小部件? 如果是的话 - 我如何从标准多对多字段复制的行为给它,因为我想filter_horizo​​ntal功能以及。

这是我的简化模型:

class City(models.Model):
    name = models.CharField(max_length=200)


class Category(models.Model):
    name = models.CharField(max_length=200)
    available_in = models.ManyToManyField(City)


class Customer(models.Model):
    name = models.CharField(max_length=200)
    city = models.ForeignKey(City)
    categories = models.ManyToManyField(Category)

Answer 1:

好吧,这是使用上面的类我的解决方案。 我加了一堆多个过滤器正确的过滤,但我想使代码可读性这里。

这正是我一直在寻找,我在这里找到我的解决方案: http://www.slideshare.net/lincolnloop/customizing-the-django-admin#stats-bottom (幻灯片50)

下面添加到我的admin.py:

class CustomerForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs):
        super(CustomerForm, self).__init__(*args, **kwargs)
        wtf = Category.objects.filter(pk=self.instance.cat_id);
        w = self.fields['categories'].widget
        choices = []
        for choice in wtf:
            choices.append((choice.id, choice.name))
        w.choices = choices


class CustomerAdmin(admin.ModelAdmin):
    list_per_page = 100
    ordering = ['submit_date',] # didnt have this one in the example, sorry
    search_fields = ['name', 'city',]
    filter_horizontal = ('categories',)
    form = CustomerForm

这种过滤“类别”列表中不删除任何功能! (即:我仍然可以有我心爱的filter_horizo​​ntal :))

该ModelForms很厉害,我有点惊讶它没有涵盖更多的文件/书籍。



Answer 2:

至于我能理解你,就是你基本上要(按城市类别)根据一些标准来筛选所显示的选择。

您可以通过使用做到这些limit_choices_to的属性models.ManyToManyField 。 所以,改变模型的定义...

class Customer(models.Model):
    name = models.CharField(max_length=200)
    city = models.ForeignKey(City)
    categories = models.ManyToManyField(Category, limit_choices_to = {'available_in': cityId})

这应该工作,为limit_choices_to ,可用于这个目的。

但有两点需要注意, limit_choices_to没有效果与自定义中间表上ManyToManyField使用时。 希望这可以帮助。



Answer 3:

另一种方法是用formfield_for_manytomany在Django管理。

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request, **kwargs):
        if db_field.name == "cars":
            kwargs["queryset"] = Car.objects.filter(owner=request.user)
        return super(MyModelAdmin, self).formfield_for_manytomany(db_field, request, **kwargs)

考虑到“汽车”是多对多领域。

检查此链接获取更多信息。



Answer 4:

我认为这是你在找什么:

http://blog.philippmetzler.com/?p=52

我们使用Django的智能选择:

http://github.com/digi604/django-smart-selects

菲利普



Answer 5:

既然你选择该客户所在的城市和类别相同的形式,你会需要一些JavaScript动态削减的类别选择器选择只在城市可用的类别。



Answer 6:

像瑞恩说,必须有一些JavaScript动态改变基于用户选择什么样的选项。 如果城市保存,管理形式被重新加载,这就是当过滤器的工作原理,但想到这里用户想要编辑的对象的情况,然后改变了城市下拉,但在类别中的选项不会刷新发布解决方案的工作。



Answer 7:

Category.objects.filter(available_in=cityobject)

这应该这样做。 视图应具有用户选择,无论是在请求或作为参数传递给该视图函数的城市。



文章来源: Filter ManyToMany box in Django Admin