#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, но этот рецепт может вам помочь:
Они передают значение фильтра, но я уверен, что вы можете получить то, что вам нужно, прочитав этот пост.
Ответ №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