Django使用自定义值管理外键下拉列表

时间:2013-10-24 09:29:58

标签: python django django-admin

我有3个Django模型:

class Test(models.Model):
    pass

class Page(models.Model):
    test = models.ForeignKey(Test)

class Question(model.Model):
    page = models.ForeignKey(Page)

如果我将Question模型注册到管理员,我会得到一个包含所需Page的下拉列表。现在,我需要修改哪些内容才能显示所需的Page 该页面的相应Test

假设,如果我创建了三个页面,则下拉列表将包含以下值:Page1Page2Page3。我希望看到:Page1 - Test1Page2 - Test1Page3 - Test1

2 个答案:

答案 0 :(得分:11)

2个选项。

选项1:

制作新的field,复制forms.ModelChoiceField并覆盖label_from_instance

# From the source
class PageModelChoiceField(forms.ModelChoiceField():
    def label_from_instance(self, obj):
        """
        This method is used to convert objects into strings; it's used to
        generate the labels for the choices presented by this object. Subclasses
        can override this method to customize the display of the choices.
        """
        # Then return what you'd like to display
        return "Page{0} - Test{1}".format(obj.pk, obj.test.pk)

这只会更改该特定下拉字段的文本。在您访问列表中每个项目的Test对象时,您可能希望确保queryset传递给PageModelChoiceField select_related('test'),否则它会生成class QuestionForm(forms.ModelForm): page = PageModelChoiceField( queryset=Page.objects.select_related('test').all() ) class Meta: model = Page class QuestionAdmin(ModelAdmin): class Meta: model: Question form: QuestionForm DB命中列表中的每个项目。

我没有测试过这个确切的代码,但逻辑就在那里。我可以稍后再尝试

Page

选项B.

更改class Page(models.Model): test = models.ForeignKey(Test) def __unicode__(self): return "Page{0} - Test{1}".format(obj.pk, obj.test.pk) unicode ()表示。

Page

这将更改在您打印页面对象print(page_object){{ page_object }}的任何位置显示{{1}}的方式。


我个人更喜欢选项1

答案 1 :(得分:0)

由于某种原因,已接受答案中的选项 B 对我不起作用,所以我想我会用对我有用的内容更新此页面。

您可以重载 Page 模型的 __str__ 函数以获得您想要的。所以,类似这样的事情

myDisplay2