Фильтрация выпадающего списка ReferenceModels, созданного appengine с использованием django - PullRequest
1 голос
/ 26 апреля 2011

У меня есть несколько классов в моем проекте движка приложения

class First(db.Model):
  count = db.IntegerProperty()

class Second(db.Model):
  first = db.ReferenceProperty(First)

class SecondForm(djangoforms.ModelForm)
  class Meta:
    model = Second

Модель SecondForm генерирует действительно хорошее выпадающее меню в шаблоне при визуализации, но в настоящее время сначала отображает все модели типа. Я бродил, если у кого-то была элегантная стратегия, позволяющая размещать условия на возвращаемых объектах (например, first.count> 10), чтобы уменьшить количество объектов, которые будут отображаться в раскрывающемся списке.

Спасибо,

Richard

Ответы [ 3 ]

2 голосов
/ 27 апреля 2011

Добавьте следующий метод init в класс SecondForm:

def __init__(self, *args, **kwargs):
    super(SecondForm, self).__init__(*args, **kwargs)
    self.fields['first'].query = db.Query(First).fetch(10)

Добавление фильтров и т. Д. В запрос для управления содержимым раскрывающегося списка !!

1 голос
/ 27 апреля 2011

У меня нет опыта использования App Engine, но этот рецепт может вам помочь:

http://appengine -cookbook.appspot.com / recipe / django-modelchoicefield-filter-input-select-by-external-key /

Они передают значение фильтра, но я уверен, что вы можете получить то, что вам нужно, прочитав этот пост.

0 голосов
/ 27 апреля 2011

Для тех, кто заинтересован в полном решении уменьшения области раскрывающегося меню до объектов-предков, которые я вставил ниже.Если вы затем настроите модель с помощью (parent = ...) и будете использовать форму, подобную приведенной ниже, в раскрывающемся списке отображаются только предки.Наслаждаться.

class WombatForm(djangoforms.ModelForm):
  def __init__(self, *args, **kwargs):
    super(WombatForm, self).__init__(*args, **kwargs)
    for field_name in self.fields:
      field_model = self.fields[field_name] 
      if isinstance(field_model,djangoforms.ModelChoiceField):
        root = WombatForm.get_root_node(self.instance)
        self.fields[field_name].query.ancestor(root)

@staticmethod
def  get_root_node(entity):
  '''
    returns the final parent ancestor of the given entity
  '''
  parent_ent = entity.parent()
  if parent_ent == None:
    return entity
  return WombatForm.get_root_node(parent_ent)

class SecondForm(WombatForm)
  class Meta:
    model = Second
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...