我有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
?
假设,如果我创建了三个页面,则下拉列表将包含以下值:Page1
,Page2
,Page3
。我希望看到:Page1 - Test1
,Page2 - Test1
,Page3 - Test1
答案 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