Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带有自定义值的Django admin外键下拉列表_Python_Django_Django Admin - Fatal编程技术网

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

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) 如果我向管理员注册问题模型,我会得到一个包含所需页面的下拉列表。现在,我必须修改什么才能显示所需的页面加上该页面对应的测试 比如说,如果我创建了三

我有3款Django车型:

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}'