sch*_*ick 34 django many-to-many django-forms django-admin django-widget
我有一个与另一个对象有多对多关系的对象.
在Django Admin中,这会在多个选择框中生成一个很长的列表.
我想过滤ManyToMany关系,因此我只获取客户选择的City中可用的类别.
这可能吗?我是否必须为它创建一个小部件?如果是这样 - 我如何将行为从标准的ManyToMany字段复制到它,因为我也想要filter_horizontal函数.
这些是我的简化模型:
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)
Run Code Online (Sandbox Code Playgroud)
sch*_*ick 37
好的,这是我使用上面的类的解决方案.我添加了一堆更多过滤器来正确过滤它,但我想在这里使代码可读.
这正是我想要的,我在这里找到了我的解决方案:http://www.slideshare.net/lincolnloop/customizing-the-django-admin#stats-bottom(slide 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
Run Code Online (Sandbox Code Playgroud)
这会过滤"类别"列表而不删除任何功能!(即:我仍然可以拥有我心爱的filter_horizontal :))
ModelForms非常强大,我有点惊讶它没有在文档/书中更多地介绍.
sim*_*rsh 15
据我所知,您基本上是想根据某些标准(根据城市的类别)过滤显示的选项.
你可以通过使用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})
Run Code Online (Sandbox Code Playgroud)
这应该可行,因为limit_choices_to可用于此目的.
但有一点需要注意,limit_choices_to在具有自定义中间表的ManyToManyField上使用时没有任何效果.希望这可以帮助.
小智 5
另一种方法是使用formfield_for_manytomanyDjango Admin.
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)
Run Code Online (Sandbox Code Playgroud)
考虑到"汽车"是ManyToMany领域.
请查看此链接以获取更多信息.
| 归档时间: |
|
| 查看次数: |
27379 次 |
| 最近记录: |