首页 > 解决方案 > ModelChoiceField 列出元组而不是简单值

问题描述

我有一个带有 ModelChoiceField 输入的 django 表单,它将结果列为元组而不是简单值。

我不知道该怎么做。

DJANGO
class PayThis(forms.Form):
   amount = forms.FloatField(required=False)
   cost2  = forms.FloatField(required=False)
   year = forms.ModelChoiceField(required=False,queryset=AnAgricol.objects.values_list('anul').all())

 HTML
 <option value="(2019,)">(2019,)</option>

我希望得到这个:< option value="2019">2019</option >

标签: djangoformsmodelchoicefield

解决方案


ModelChoiceField顾名思义,A处理模型对象。因此你不能values_list在这里使用。

因此,您Form应该定义如下内容:

class PayThis(forms.Form):
    amount = forms.FloatField(required=False)
    cost2  = forms.FloatField(required=False)
    year = forms.ModelChoiceField(required=False, queryset=AnAgricol.objects.all())

您可以覆盖__str__返回年份的字符串表示形式,例如:

AnAgricol(models.Model):
    anul = models.IntegerField()

    def __str__(self):
        return str(self.anul)

但是,如果年份不是要代表的东西AnAgricol,那么您可以使用ChoiceField[Django-doc],例如:

class PayThis(forms.Form):
    amount = forms.FloatField(required=False)
    cost2 = forms.FloatField(required=False)
    year = forms.ChoiceField(required=False, choices=[])

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['year'].choices = [
            (yr, yr) for yr
            in AnAgricol.objects.values_list('anul', flat=True).distinct()
        ]

推荐阅读