模型:
class Store(models.Model):
name = models.CharField(max_length = 20)
class Admin:
pass
def __unicode__(self):
return self.name
class Stock(Store):
products = models.ManyToManyField(Product)
class Admin:
pass
def __unicode__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length = 128, unique = True)
parent = models.ForeignKey('self', null = True, blank = True, related_name='children')
(...)
def __unicode__(self):
return self.name
mptt.register(Product, order_insertion_by = ['name'])
Run Code Online (Sandbox Code Playgroud)
admin.py:
from bar.drinkstore.models import Store, Stock
from django.contrib import admin
admin.site.register(Store)
admin.site.register(Stock)
Run Code Online (Sandbox Code Playgroud)
现在,当我查看管理站点时,我可以从列表中选择任何产品.但我想有一个有限的选择 - 只留下.在mptt类中有功能:
is_leaf_node() - 如果模型实例是叶节点(它没有子节点),则返回True,否则返回False.
但我不知道如何连接它
我正在尝试创建一个子类:在admin.py中:
from bar.drinkstore.models import Store, Stock
from django.contrib import admin
admin.site.register(Store)
class StockAdmin(admin.ModelAdmin):
def queryset(self, request):
return super(StockAdmin, self).queryset(request).filter(ihavenoideawhatfilter)
admin.site.register(Stock, StockAdmin)
Run Code Online (Sandbox Code Playgroud)
但我不确定它是否正确,以及过滤器设置.
UPD:这是一种错误的方式.StockAdmin类中的queryset生成股票列表.但我需要过滤产品清单"库存" - 仍然不知道如何.
编辑:完全更新了这个
所以查询集最后还可以,但你需要在Stock页面选择框中过滤产品(我猜?).您可以为Stock ModelAdmin定义自定义表单.
class StockForm(ModelForm):
products = forms.ModelChoiceField(queryset=Products.objects.filter(lft=F('rght')-1))
class Meta:
model = Stock
class StockAdmin(admin.ModelAdmin):
form = StockForm
Run Code Online (Sandbox Code Playgroud)