[英]What's the straightforward way to implement one to many editing in list_editable in django admin?
鉴于以下型号:
class Store(models.Model):
name = models.CharField(max_length=150)
class ItemGroup(models.Model):
group = models.CharField(max_length=100)
code = models.CharField(max_length=20)
class ItemType(models.Model):
store = models.ForeignKey(Store, on_delete=models.CASCADE, related_name="item_types")
item_group = models.ForeignKey(ItemGroup)
type = models.CharField(max_length=100)
内嵌的手柄添加多个item_types
到Store
观看一个很好时, Store
。
内容管理员团队希望能够批量编辑商店及其类型。 有没有实现一个简单的方法Store.item_types
在list_editable
这也允许添加新的记录,类似horizontal_filter
? 如果没有,是否有一个简单的指南,说明如何实现自定义list_editable
模板? 我一直在谷歌搜索,但一直无法想出任何东西。
此外,如果有一种更简单或更好的方法来设置这些模型,以便更容易实现,请随意发表评论。
如何使ItemType成为Store的ManyToManyField?
对我来说,似乎合乎逻辑的是,如果您要更改商店中可用的ItemType,您将更改商店的属性(而不是ItemType)。
例如:
from django.db import models
class ItemGroup(models.Model):
group = models.CharField(max_length=100)
code = models.CharField(max_length=20)
class ItemType(models.Model):
item_group = models.ForeignKey(ItemGroup)
type = models.CharField(max_length=100)
class Store(models.Model):
name = models.CharField(max_length=150)
item_type = models.ManyToManyField(ItemType, related_name="store")
# admin
from django.contrib import admin
class StoreAdmin(admin.ModelAdmin):
list_display=('name', 'item_type',)
list_editable=('item_type',)
for model in [(Store, StoreAdmin), (ItemGroup,), (ItemType,)]:
admin.site.register(*model)
我在这里收到错误:
File "C:\Python27\lib\site-packages\django\contrib\admin\validation.py", line 43, in validate
% (cls.__name__, idx, field))
django.core.exceptions.ImproperlyConfigured: 'StoreAdmin.list_display[1]', 'item_type' is a ManyToManyField which is not supported.
我通过在django.contrib.admin.validation中注释掉第41-43行解决了这个问题:
#if isinstance(f, models.ManyToManyField):
# raise ImproperlyConfigured("'%s.list_display[%d]', '%s' is a ManyToManyField which is not supported."
# % (cls.__name__, idx, field))
可能不是理想的解决方案,但它似乎对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.