【问题标题】:Django admin manage ForeignKey in Add/Edit formDjango 管理员在添加/编辑表单中管理 ForeignKey
【发布时间】:2019-03-13 19:03:29
【问题描述】:

在我的 django 应用中,我有这个模型:

class temp_test_keywords(models.Model):
    id = models.AutoField(primary_key=True)
    main_id = models.ForeignKey(temp_main, on_delete=models.CASCADE, related_name='tm_ttk')
    test_id = models.ForeignKey(temp_case, on_delete=models.CASCADE, related_name='tc_ttk')
    key_id = models.ForeignKey(temp_keywords, on_delete=models.CASCADE, related_name='tk_ttk')
    key_val = models.CharField(max_length=200, null=True, blank=True, verbose_name='Value')
    key_group = models.CharField(max_length=200, null=True, blank=True, verbose_name='Group')
    #Fields for API permissions
    owner = models.ForeignKey('auth.User', related_name='ttestkey_owner', on_delete=models.CASCADE, verbose_name="API Owner")

在 admin.py 中,我为管理列表创建相对的 ModelAdmin,添加和编辑选项:

class temp_test_keywordsAdmin(admin.ModelAdmin):

    list_filter = ('main_id__descr', 'test_id__descr')
    list_display = ('get_main_id', 'get_test_id', 'key_id', 'key_val', 'key_group')

    def get_main_id(self, obj):
        return obj.main_id.descr

    def get_test_id(self, obj):
        return obj.test_id.descr

    get_main_id.short_description = 'Main Template'
    get_main_id.admin_order_field = 'main_id__descr'

    get_test_id.short_description = 'Test Case'
    get_test_id.admin_order_field = 'test_id__descr'

现在,当我在 changelist_view 模板中查看 m 数据时,一切都已完成,但是当我尝试在我的 test_id 字段中添加或编辑记录时,我看到的是对象 (test_case_obj(1)) 而不是 descr 字段。 我如何在添加/编辑管理表单中管理 ForeignKey 以指向特定字段?

提前非常感谢

【问题讨论】:

    标签: python django django-models django-admin django-orm


    【解决方案1】:

    您应该为此在模型中定义__str__ 方法。例如:

    class temp_case(models.Model):
        ...
    
        def __str__(self):
            return "%s" % (self.descr)
    

    如果您想在管理面板上为您的对象提供其他表示,您可以创建一个自定义表单并定义 ModelChoiceField 的自定义表示,如文档中的 here 所示。

    文档建议子类化 ModelChoiceField 并覆盖label_from_instance 方法。

    希望对你有帮助。

    【讨论】: