Django 管理员以 Add/Edit 形式管理外键
Django admin manage ForeignKey in Add/Edit form
在我的 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
字段。
我如何在 add/edit 管理表单中管理 ForeignKey
以指向特定字段?
非常感谢
您应该为此在模型中定义 __str__
方法。例如:
class temp_case(models.Model):
...
def __str__(self):
return "%s" % (self.descr)
如果您希望在管理面板上为您的对象使用其他表示形式,您可以创建自定义表单并定义 ModelChoiceField
的自定义表示形式,如 here 所述。
文档建议 子类 ModelChoiceField
并覆盖 label_from_instance
方法。
希望对您有所帮助。
在我的 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
字段。
我如何在 add/edit 管理表单中管理 ForeignKey
以指向特定字段?
非常感谢
您应该为此在模型中定义 __str__
方法。例如:
class temp_case(models.Model):
...
def __str__(self):
return "%s" % (self.descr)
如果您希望在管理面板上为您的对象使用其他表示形式,您可以创建自定义表单并定义 ModelChoiceField
的自定义表示形式,如 here 所述。
文档建议 子类 ModelChoiceField
并覆盖 label_from_instance
方法。
希望对您有所帮助。