Python 带有自定义值的Django admin外键下拉列表
我有3款Django车型:Python 带有自定义值的Django admin外键下拉列表,python,django,django-admin,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) 如果我向管理员注册问题模型,我会得到一个包含所需页面的下拉列表。现在,我必须修改什么才能显示所需的页面加上该页面对应的测试 比如说,如果我创建了三
class Test(models.Model):
pass
class Page(models.Model):
test = models.ForeignKey(Test)
class Question(model.Model):
page = models.ForeignKey(Page)
如果我向管理员注册问题
模型,我会得到一个包含所需页面
的下拉列表。现在,我必须修改什么才能显示所需的页面
加上该页面对应的测试
比如说,如果我创建了三个页面,下拉列表将包含以下值:Page1
,Page2
,Page3
。我想看看:Page1-Test1
,Page2-Test1
,Page3-Test1
2选项
备选案文1:
创建一个新的字段
,复制表单。modelcoocefield
并覆盖label\u from\u实例
# 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
对象时,您可能希望确保传递到PageModelChoiceField
的queryset
具有select_related('Test')
,否则它将对列表中的每个项目进行DB命中
我没有测试过这段代码,但逻辑是存在的。等我可以的时候再试试
备选案文B 更改
页面的unicode()表示形式
class Page(models.Model):
test = models.ForeignKey(Test)
def __unicode__(self):
return "Page{0} - Test{1}".format(obj.pk, obj.test.pk)
这将改变页面
在打印页面对象的任何地方的显示方式,打印(页面对象)
,{{Page对象}
就我个人而言,我更喜欢选项1,因为某些原因,接受答案中的选项B不适合我,所以我想我应该用适合我的选项更新此页面
您可以重载页面模型的_ustr__;函数以获得所需的内容。那么,大致是这样的
class Page(models.Model):
test = models.ForeignKey(Test)
def __str__(self):
return f'Page{self.pk} - Test{self.test.pk}'
是否要在“管理员列表”页面中显示此内容?我想在“问题添加/编辑”页面中显示此内容。感谢您的详细回答!很乐意帮忙。我总是喜欢完整的答案,所以我认为最好自己也提供:)谢谢。。选择B让我很开心。。使用“self.”而不是“obj.pk”
class Page(models.Model):
test = models.ForeignKey(Test)
def __str__(self):
return f'Page{self.pk} - Test{self.test.pk}'