2017-07-18 18 views
1

私のpostgresデータベースのビューからMultiple Choice Fieldを作成しようとしていますが、Webページが正しく表示されていません。具体的には、正しい数の選択肢を提供しているが、「check_name」フィールドで名前を付けない代わりに、「Select 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

最も簡単な解決方法は、Checkモデルに__str__メソッドを追加することです。あなたが__str__法の結果とは異なる値を表示したい場合は

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 

、あなたは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

これは私のために働いたので、私は、ANSERを受け入れたが、 'to_field_name =「check_nameは」'同じことを達成しているべきではないのですか? – chaserchap

+0

いいえ。[docsの例(https://docs.djangoproject.com/en/1.11/ref/forms/fields/#django.forms.ModelChoiceField.to_field_name)に示すように、 'to_field_name'は値を制御しますあなたが見ているラベルではなく、あなたが見ることのできないオプションの名前です。 – Alasdair