如何从Django ModelChoiceField查询集中选择值和标签

hel*_*013 14 html python forms django model

我试图创建一个django表单,我的一个字段包含一个ModelChoiceField

class FooForm(forms.Form):

    person =  forms.ModelChoiceField(queryset=Person.objects.filter(is_active=True).order_by('id'), required=False)
    age = forms.IntegerField(min_value=18, max_value=99, required=False)
Run Code Online (Sandbox Code Playgroud)

当我尝试上面的代码时,它返回的是html输出

<option value="1">Person object</option>
Run Code Online (Sandbox Code Playgroud)

在我的人物模型上我有字段"id,fname,lname,is_active".是否可以指定我的下拉选项将使用"id"作为值并使用"lname"作为标签?预期的html应该是

<option value="1">My Last Name</option>
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Fog*_*ird 28

来自Django文档:

https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.ModelChoiceField

将调用模型的__unicode__(__str__在Python 3上)方法来生成对象的字符串表示,以便在字段的选择中使用; 提供自定义表示,子类ModelChoiceField和覆盖label_from_instance.此方法将接收模型对象,并应返回适合表示它的字符串.例如:

from django.forms import ModelChoiceField

class MyModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return "My Object #%i" % obj.id
Run Code Online (Sandbox Code Playgroud)

因此,您可以这样做,或覆盖__str__您的模型类以返回姓氏.


Tho*_*ner 26

你可以在Form的init中添加对label_from_instance的调用,即

通过添加类似的东西

class TestForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(TestForm, self).__init__(*args, **kwargs)

        self.fields['field_name'].label_from_instance = self.label_from_instance

    @staticmethod
    def label_from_instance(obj):
        return "My Field name %s" % obj.name
Run Code Online (Sandbox Code Playgroud)


dan*_*eia 7

在您的Person模型中添加:

def __unicode__(self):
    return u'{0}'.format(self.lname)
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 3,那么请定义__str__而不是__unicode__.

def __str__(self):
    return u'{0}'.format(self.lname)
Run Code Online (Sandbox Code Playgroud)

  • 但是如果你不想要__unicode__会怎么样呢.你能告诉它用什么吗? (2认同)