2017-07-18 58 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

相关问题