2014-11-24 109 views
-1

正如所說的標題。我不明白爲什麼ModelSorm for classeur中的過濾器不起作用。它返回數據庫的所有列(在關聯表單中),就像我編寫Classeur.objects.all()一樣。django modelForm過濾器無效?

型號:

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和約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網站)。

Thinqs for your light。

回答

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