Django管理外键下拉字段列表只有“测试对象”

时间:2011-05-02 06:03:03

标签: django django-admin

我有这两个类:

class Test(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(User)
    groups = models.ManyToManyField(Group)

class TestSubjectSet(models.Model):
    id =  models.AutoField(primary_key=True)
    test = models.ForeignKey(Test)
    subject = models.ManyToManyField(Subject)

TestSubjectSet表单测试列表仅显示字符串“test object”。

3 个答案:

答案 0 :(得分:25)

您必须在模型类中添加__unicode__(self)__str__(self)方法。

http://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs#django.db.models.Model.unicode

答案 1 :(得分:3)

有同样的问题。添加

def __str__(self):
    return self.user

解决了这个问题。

答案 2 :(得分:1)

有时您希望从 str 函数返回不同的信息,但希望在admin下拉菜单中显示一些不同的信息。然后上述解决方案将不起作用。

您可以通过对form.ModelChoiceField进行子类化来实现此目的。

class TestChoiceField(forms.ModelChoiceField):
 def label_from_instance(self, obj):
     return "Test: {}".format(obj.id)

然后您可以覆盖formfield_for_foreignkey

def formfield_for_foreignkey(self, db_field, request, **kwargs):
  if db_field.name == 'test':
    return TestChoiceField(queryset=Test.objects.all())
  return super().formfield_for_foreignkey(db_field, request, **kwargs)