2011-04-26 93 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