2011-04-26 95 views
1

我在我的應用程序引擎項目篩選下拉使用Django

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

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

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

渲染時SecondForm模型產生了一個非常好的下拉菜單中的模板中的一些類通過AppEngine上創建ReferenceModels的列表中,但目前的顯示器所有類型的模型第一。如果任何人有一個優雅的策略允許條件放在返回的對象上(比如first.count> 10),以減少將在下拉列表中呈現的對象的數量,我就會流浪。

感謝,

理查德

+0

爲什麼你不能使用帶限制的提取渲染到模板 – 2011-04-27 03:31:19

回答

2

以下的init方法添加到SecondForm類:

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

添加過濾器等來查詢,以控制下拉列表內容!

+0

謝謝。優雅和簡單,很好的答案。 – 2011-04-27 08:43:58

0

對於那些對將下拉菜單的範圍縮小爲只有祖先對象的完整解決方案感興趣的人,我已將其粘貼到下面。如果您隨後使用(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