Django admin外键下拉列表,带有自定义值

2024-05-19 01:05:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个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


Tags: djangotest列表modelmodelspagepassclass
1条回答
网友
1楼 · 发布于 2024-05-19 01:05:29

两种选择。

选项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对象时,您可能需要确保传递给PageModelChoiceFieldqueryset具有select_related('test'),否则它将对列表中的每个项产生DB命中。

我没有测试过这个确切的代码,但是逻辑就在那里。等我能

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

选项B

更改Pageunicode表示形式。

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

    def __unicode__(self):
        return "Page{0} - Test{1}".format(obj.pk, obj.test.pk)

这将改变Pages在打印页面对象print(page_object){{ page_object }}时的显示方式。


我个人更喜欢选择1

相关问题 更多 >

    热门问题