如标题所述。我不明白为什么在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为你的光。
答案 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