django modelForm过滤器效果不好?

时间:2014-11-24 13:30:42

标签: python django

如标题所述。我不明白为什么在classeur的ModelForm中的过滤器不起作用。它返回数据库的所有列(在关联表单中),就好像我写了Classeur.objects.all()。

型号:

  class Document(models.Model):
      classeur = models.ForeignKey(Classeur, verbose_name=u"classeur", null=True)
      #some other attribute
  class Classeur(models.Model):
       type_classeur = models.ForeignKey(TypeClasseur)
       #some other attribute

ModelForm:

class DocumentFidsourceForm(forms.ModelForm):

    classeur = Classeur.objects.filter(type_classeur=1).order_by('rang')
    #some piece of code

    class Meta:
        model = Document

Views.py:

 form = DocumentFidsourceForm()
    return render_to_response('documents/createDoc.html',
                          {'form': form,
                           #other param}

模板:

 <table align="center" cellspacing="5" class="table_form">
        <tr>
            <td class="label">{{form.classeur.label|safe}} : </td>
            <td class="box">{{form.classeur}}</td>

对于上下文,我有一个模型Classeur,其中包含许多attribut和DB中的大约4000个条目。运行django 1.6

当我在db上进行如下选择时,我得到15个结果(“好”结果)。

Select * from classeur where type_classeur_id = 1

所以答案可能是?:我无法在modelForm中对Classeur进行过滤(假设我可以)。

在django 1.6中有一个隐藏的东西,它转换我的过滤器以显示所有值并让用户选择(当你有一个选择~~4000个值但机器的nervermind时,这非常令人尴尬。)

我做了一些愚蠢的事(目前正试图发展1.1到1.6 django网站)。

Lightqs为你的光。

1 个答案:

答案 0 :(得分:2)

您需要使用ModelChoiceField从查询集创建选择输入。

例如:

class DocumentFidsourceForm(forms.ModelForm):
    classeur = forms.ModelChoiceField(
        queryset=Classeur.objects.filter(type_classeur=1).order_by('rang')
    )
    #some piece of code

    class Meta:
        model = Document

如果始终要过滤Document.classeur,那么您可以在Document模型上修改字段定义以使用limit_choices_to

class Document(models.Model):
    classeur = models.ForeignKey(
        Classeur,
        limit_choices_to={'type_classeur__id': 1},
        verbose_name=u"classeur",
        null=True
    )
    #some other attribute