11

我有 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 - Test1, Page2 - Test1,Page3 - Test1

4

2 回答 2

12

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传递给PageModelChoiceFieldhas 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

选项 B。

更改. _ _Page

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

于 2013-10-24T10:00:39.560 回答
0

出于某种原因,接受的答案中的选项 B 对我不起作用,所以我想我会用对我有用的东西来更新这个页面。

您可以为 Page 模型重载 __str__ 函数以获得所需的内容。所以,类似这样的事情

class Page(models.Model):
   test = models.ForeignKey(Test)
   def __str__(self):
      return f'Page{self.pk} - Test{self.test.pk}'
于 2021-04-14T16:30:01.383 回答