2017-07-18 60 views
1

我試圖從我的postgres數據庫的視圖中創建一個多選項字段,但網頁顯示不正確。具體來說,雖然它提供了正確的選擇數,但它並沒有通過「check_name」字段命名,而是將每個選擇命名爲「Check object」。這裏是我的代碼:Django ModelMultipleChoiceField不顯示正確的選擇名稱

models.py

class Check(models.Model): 
    pkey = models.AutoField(primary_key=True) 
    cif = models.CharField(max_length=255) 
    check_name = models.CharField(max_length=255) 
    description = models.TextField() 

    class Meta: 
     managed = False 
     db_table = 'precheck_check' 

forms.py

class ProcessFileForm(forms.Form): 
    checks_to_run = forms.ModelMultipleChoiceField(
     queryset = Check.objects.all(), 
     to_field_name = "check_name", 
     widget = forms.CheckboxSelectMultiple, 
     ) 

views.py

def successful_upload(request): 
    if request.method == 'POST': 
     form = ProcessFileForm(request.POST, user=request.user) 
     if form.is_valid(): 
      return render(request, 'precheck/checks_successful.html') 
    else: 
     form = ProcessFileForm() 
    return render(request, 'precheck/select_checks.html',{'form':form}) 

值得注意的是,我正在從postgres數據庫中名爲'precheck_check'的視圖中提取數據。它似乎正確地看到了這個視圖,因爲它給了我正確的選擇數量。

回答

1

最簡單的修復方法是將__str__方法添加到您的Check模型中。

from django.utils.encoding import python_2_unicode_compatible 

@python_2_unicode_compatible # only if you need to support Python 2 
class Check(models.Model): 
    pkey = models.AutoField(primary_key=True) 
    cif = models.CharField(max_length=255) 
    check_name = models.CharField(max_length=255) 
    description = models.TextField() 

    class Meta: 
     managed = False 
     db_table = 'precheck_check' 

    def __str__(self): 
     return self.check_name 

如果要顯示比__str__方法的結果是不同的值,你也可以繼承ModelMultipleChoiceField和覆蓋label_from_instance

from django import forms 

class MyModelMultipleChoiceField(forms.ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return obj.check_name 

然後使用場形式:

class ProcessFileForm(forms.Form): 
    checks_to_run = forms.MyModelMultipleChoiceField(...) 
+0

這爲我工作,所以我接受了雁,但應該不是'to_field_name =「check_name」'完成了同樣的事情? – chaserchap

+0

否。作爲[文檔中的示例](https://docs.djangoproject.com/en/1.11/ref/forms/fields/#django.forms.ModelChoiceField.to_field_name)顯示,「to_field_name」控制值的選項(你沒有看到),而不是你看到的標籤。 – Alasdair

相關問題