Фильтрация выпадающего списка ссылочных моделей, созданных appengine с использованием django

#python #django #google-app-engine

#python #django #google-app-engine

Вопрос:

У меня есть несколько классов в моем проекте app engine

 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. Я задавался вопросом, есть ли у кого-нибудь элегантная стратегия, позволяющая размещать условия для возвращаемых объектов (например, для first.count > 10), чтобы уменьшить количество объектов, которые будут отображаться в выпадающем списке.

Спасибо,

Ричард

Комментарии:

1. Почему вы не можете использовать выборку с ограничением для отображения в шаблоне

Ответ №1:

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

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

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

Ответ №2:

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

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

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

Ответ №3:

Для тех, кого интересует полное решение по сокращению области действия выпадающего меню только до объектов-предков, я вставил его ниже. Если вы затем настроите модель с помощью (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