You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Admin修改表单中显示关联表内容?

在Django Admin修改表单中展示关联表内容

嘿,作为编程、Python和Django的新手,能自己动手搭建食谱应用已经超棒啦!关于在Admin的修改表单里展示关联表内容,我给你分几种常见场景讲清楚:

1. 一对多关联场景(比如食谱对应多个食材)

首先咱们先补一个典型的关联模型示例(假设你有一个和Recipe关联的Ingredient模型):

# models.py
from django.db import models
from datetime import date

class Recipe(models.Model):
    recipe_name = models.CharField(max_length=30)
    recipe_instructions = models.TextField()
    recipe_whyitworks = models.TextField(verbose_name="Why It Works")
    recipe_date = models.DateField()
    
    def __str__(self):
        return self.recipe_name
    
    def was_published_recently(self):
        return self.recipe_date >= date.today() - date(days=7)  # 补全你未写完的逻辑

# 关联的食材模型
class Ingredient(models.Model):
    recipe = models.ForeignKey(Recipe, on_delete=models.CASCADE, related_name="ingredients")
    name = models.CharField(max_length=50)
    quantity = models.CharField(max_length=20)  # 比如"1杯"、"200克"
    
    def __str__(self):
        return f"{self.quantity} of {self.name}"

用Inline内联展示(同页面编辑关联内容)

这是最实用的方式——在修改Recipe的表单页面,直接展示并编辑关联的Ingredient内容。你需要在admin.py里这样配置:

# admin.py
from django.contrib import admin
from .models import Recipe, Ingredient

# 定义内联类
class IngredientInline(admin.TabularInline):  # 换成StackedInline会变成堆叠式布局,按需选择
    model = Ingredient
    extra = 1  # 默认显示1个空的食材输入框,方便添加新内容

# 注册Recipe模型并关联内联
@admin.register(Recipe)
class RecipeAdmin(admin.ModelAdmin):
    # 列表页展示的字段
    list_display = ('recipe_name', 'recipe_date', 'was_published_recently')
    # 在修改表单中添加内联的食材表
    inlines = [IngredientInline]

2. 多对多关联场景(比如食谱对应多个标签)

如果你的关联是多对多(比如Recipe和Tag标签),可以用更友好的选择器展示:

# models.py
class Tag(models.Model):
    name = models.CharField(max_length=20)  # 比如"素食"、"烘焙"
    
    def __str__(self):
        return self.name

class Recipe(models.Model):
    # 保留你原来的所有字段...
    tags = models.ManyToManyField(Tag, related_name="recipes")

在Admin中配置友好的多对多选择器

在admin.py里用filter_horizontal或filter_vertical优化展示:

# admin.py
@admin.register(Recipe)
class RecipeAdmin(admin.ModelAdmin):
    # 其他配置...
    filter_horizontal = ('tags',)  # 水平分栏的选择器,左边可选右边已选;用filter_vertical是垂直布局

3. 只读展示关联内容(仅查看不编辑)

如果你只想展示关联内容而不允许编辑,可以自定义只读字段:

# admin.py
@admin.register(Recipe)
class RecipeAdmin(admin.ModelAdmin):
    readonly_fields = ('display_ingredients',)
    
    def display_ingredients(self, obj):
        # 把关联的食材用逗号分隔成字符串展示
        return ", ".join([f"{ing.quantity} {ing.name}" for ing in obj.ingredients.all()])
    display_ingredients.short_description = '关联食材'  # 自定义显示的字段名称

内容的提问来源于stack exchange,提问作者Baron Young

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:57:22