Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django ModelMultipleChiceField未显示正确的选项名称_Python_Django_Postgresql - Fatal编程技术网

Python Django ModelMultipleChiceField未显示正确的选项名称

Python Django ModelMultipleChiceField未显示正确的选项名称,python,django,postgresql,Python,Django,Postgresql,我正试图从我的postgres db的视图中创建一个多选字段,但是网页显示不正确。具体来说,虽然它提供了正确的选择数量,但它并没有通过“check_name”字段来命名它们,而是将每个选择命名为“check object”。这是我的密码: 型号.py class Check(models.Model): pkey = models.AutoField(primary_key=True) cif = models.CharField(max_length=255) chec

我正试图从我的postgres db的视图中创建一个多选字段,但是网页显示不正确。具体来说,虽然它提供了正确的选择数量,但它并没有通过“check_name”字段来命名它们,而是将每个选择命名为“check object”。这是我的密码:

型号.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'
class ProcessFileForm(forms.Form):
    checks_to_run = forms.ModelMultipleChoiceField(
        queryset = Check.objects.all(),
        to_field_name = "check_name",
        widget = forms.CheckboxSelectMultiple,
        )
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})
forms.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'
class ProcessFileForm(forms.Form):
    checks_to_run = forms.ModelMultipleChoiceField(
        queryset = Check.objects.all(),
        to_field_name = "check_name",
        widget = forms.CheckboxSelectMultiple,
        )
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})
视图.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'
class ProcessFileForm(forms.Form):
    checks_to_run = forms.ModelMultipleChoiceField(
        queryset = Check.objects.all(),
        to_field_name = "check_name",
        widget = forms.CheckboxSelectMultiple,
        )
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 db中名为“precheck_check”的视图中提取数据。它似乎正确地看到了视图,因为它为我提供了正确的选择数量。

最简单的修复方法是向您的
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
如果要显示与
\uu str\uu
方法的结果不同的值,可以从\u实例子类化并重写
标签

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(...)

这对我来说很有效,所以我接受了答案,但是
to_field_name=“check_name”
不应该完成同样的事情吗?不。如图所示,to_field_name
控制选项的值(你看不到),而不是你看到的标签。