【问题标题】:Django ModelMultipleChoiceField not displaying correct Choice namesDjango ModelMultipleChoiceField 不显示正确的选项名称
【发布时间】:2017-07-18 13:57:10
【问题描述】:

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

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”的视图中提取数据。它似乎正确地看到了视图,因为它给了我正确数量的选择。

【问题讨论】:

    标签: python django postgresql


    【解决方案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(...)
    

    【讨论】:

    • 这对我有用,所以我接受了分析器,但 to_field_name = "check_name" 不应该完成同样的事情吗?
    • 没有。正如example in the docs 所示,to_field_name 控制选项的值(您看不到),而不是您看到的标签。
    猜你喜欢
    • 2013-04-05
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多