django admin如何限制选择框值

时间:2010-06-11 10:09:11

标签: django admin

模型:

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'])

admin.py:

from bar.drinkstore.models import Store, Stock

from django.contrib import admin

admin.site.register(Store)
admin.site.register(Stock)

现在,当我查看管理员网站时,我可以从列表中选择任何产品。但我想有一个有限的选择 - 只留下。在mptt类中有功能:

  

is_leaf_node() - 如果返回True   模型实例是叶节点(它   没有孩子),否则就是假。

但我不知道如何连接它

我正在尝试创建一个子类:在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)

但我不确定它是否正确,以及过滤器设置。

UPD:这是一种错误的方式。 StockAdmin类中的queryset生成股票列表。但我需要过滤产品清单“库存” - 仍然不知道如何。

3 个答案:

答案 0 :(得分:5)

修改:完全更新了此

所以查询集终于可以,但你需要在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

答案 1 :(得分:3)

Botondus有正确的想法,但你不能用annotate做到这一点 - 这是针对相关查询集的聚合。请尝试使用extra

qs = super(StockAdmin, self).queryset(request).extra(
        select={ 'desc_count': '(rght-lft-1)/2' }
     ).filter(desc_count=0)

答案 2 :(得分:0)

到目前为止,你的想法是正确的,我不是如何正确过滤这个问题的专家,但是如果你看mptt.models.get_descendant_count,你会看到我计算的后代数量,那些数字是零。我想你必须把这个条件变成原始的sql!

编辑:我刚才再次阅读你问题的标题,现在是关于seectbox值还是更改更改列表的查询集?

相关问题