Администратор Django, как ограничить значения выбора - PullRequest
2 голосов
/ 11 июня 2010

модель:

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, если экземпляр модели является листовым узлом (у него нет дочерних элементов), иначе 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)

, но я не уверен, что это правильный путь, и чтонабор фильтров.

UPD: Это совершенно неверный путь.набор запросов в классе StockAdmin создает список акций.Но мне нужно отфильтровать список товаров «на складе» - все равно не знаю как.

Ответы [ 3 ]

5 голосов
/ 11 июня 2010

Редактировать : Полностью обновлено это

Итак, набор запросов, наконец, в порядке, но вам нужно отфильтровать продукты в окне выбора на странице товара (я полагаю?)Вы можете определить пользовательскую форму для 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
3 голосов
/ 11 июня 2010

Botondus имеет правильную идею, но вы не можете сделать это с annotate - это для агрегирования по связанным наборам запросов. Попробуйте использовать extra вместо:

qs = super(StockAdmin, self).queryset(request).extra(
        select={ 'desc_count': '(rght-lft-1)/2' }
     ).filter(desc_count=0)
0 голосов
/ 11 июня 2010

Пока ваша идея верна, я не эксперт в том, как правильно отфильтровать это, но если вы посмотрите на mptt.models.get_descendant_count, вы увидите, как подсчитано количество потомков, листья - это те, где количество равно нулю.Я полагаю, вам придется превратить это условие в raw sql!

РЕДАКТИРОВАТЬ: Я только что прочитал название вашего вопроса еще раз прямо сейчас, это сейчас о значениях seectbox или об изменении набора запросов для списка изменений?

...