Django Crispy Multichoices Form(Foreignkey)正在打印" Object"而不是Object.name

时间:2016-03-14 19:59:23

标签: python django foreign-keys django-crispy-forms

我有这个model.py

class BD(models.Model):
    b_Name = models.CharField(max_length=200)

    def __unicode__(self):
        return self.b_Name


class Data(models.Model):
    o_name = models.CharField(verbose_name='Enter your Name', max_length=100)
    d_name = models.CharField(max_length=100)
    b = models.ForeignKey(BD)

我有这个form.py:

from django import forms
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit, Layout, Field
from crispy_forms.bootstrap import (
    PrependedText, PrependedAppendedText, FormActions)

from .models import Data, BD


class Form(forms.ModelForm):
    class Meta:
        model = Data
        fields = ('o_name', 'd_name', 'b')
    helper = FormHelper()
    helper.form_method = 'POST'
    helper.add_input(Submit('Submit', 'Submit', css_class='btn-primary'))

问题在于b。 因此,如果我正确理解它是如何工作的,那么外键使得django得到一个名为" data_DB"的表中包含的一些对象。在我的postgresql服务器上。
我不能得到的是,对于b,crispy应该生成一个列表框,其中包含postgresql表的每一行的b_name,而它只显示" BD对象"作为一个选择,我的表中有多少行。

我想到了这个功能:

def __unicode__(self):
        return self.b_Name

意味着返回我对对象感兴趣而不是对象本身。

我误解了什么?

编辑:这是HTML输出:

<select class="select form-control" id="id_b" name="b">
<option value="" selected="selected">---------</option>
<option value="2">BData object</option>
<option value="1">BData object</option>
<option value="3">BData object</option>
</select>

值应为BDdate.b_Name

1 个答案:

答案 0 :(得分:2)

在Python 3中,您应该使用 select * from sysobjects where xtype = 'TR' 而不是__str__来定义模型的字符串表示形式。请参阅models documentation

中的示例