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

如何在Django Admin中编辑多对多中间表值并创建带配料的鸡尾酒?

没问题,这事儿用Django Admin的内联(Inline)组件就能轻松搞定!我给你一步步拆解具体怎么做:

步骤1:确认你的模型结构(确保中间模型配置正确)

首先得保证你的IngredientAmount中间模型关联了Cocktail和Ingredient,并且包含amount_in_oz字段,这里给你一个标准的模型示例(如果你的模型已经这么写了,可以跳过这步):

from django.db import models

class Ingredient(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Cocktail(models.Model):
    name = models.CharField(max_length=100)
    # 通过through指定中间模型
    ingredients = models.ManyToManyField(Ingredient, through='IngredientAmount')

    def __str__(self):
        return self.name

class IngredientAmount(models.Model):
    cocktail = models.ForeignKey(Cocktail, on_delete=models.CASCADE)
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    amount_in_oz = models.DecimalField(max_digits=4, decimal_places=2)

    class Meta:
        # 防止同一个鸡尾酒重复添加同一种配料
        unique_together = ('cocktail', 'ingredient')
步骤2:配置Django Admin的内联组件

因为用了through指定多对多中间模型,Django Admin默认不会自动显示关联的配料和量的表单,所以我们需要用**内联(Inline)**把IngredientAmount的字段嵌入到Cocktail的添加/编辑页面里。

在你的admin.py里添加以下代码:

from django.contrib import admin
from .models import Cocktail, Ingredient, IngredientAmount

# 创建内联类,用来在Cocktail页面显示配料和量的表单
class IngredientAmountInline(admin.TabularInline):
    model = IngredientAmount
    extra = 1  # 默认显示1个空的配料条目,你可以改成3或者其他数字,方便一次性加多个配料
    # 可选:当配料很多时,用搜索框代替下拉选单,提升体验
    autocomplete_fields = ['ingredient']

# 注册Cocktail的Admin类,并关联上面的内联
@admin.register(Cocktail)
class CocktailAdmin(admin.ModelAdmin):
    list_display = ('name',)  # 列表页显示鸡尾酒名称
    inlines = [IngredientAmountInline]  # 把配料内联加进来

# 注册Ingredient的Admin类,配合上面的autocomplete_fields
@admin.register(Ingredient)
class IngredientAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)  # 让配料的搜索框能生效
额外优化小技巧
  • 如果不喜欢表格形式的内联,可以把admin.TabularInline换成admin.StackedInline,这样每个配料条目会是堆叠的形式
  • extra参数可以根据你的使用习惯调整,比如经常一次加3种配料,就设为extra=3
  • 可以给IngredientAmount的__str__方法加个返回值,方便在Admin里识别条目:
    def __str__(self):
        return f"{self.ingredient.name} - {self.amount_in_oz}oz"
    

做完这些配置后,重启你的Django服务器,进入Admin的「Add Cocktail」页面,就能看到:

  • 顶部的鸡尾酒名称输入框
  • 下面的配料表格,每行可以选择配料、输入对应的盎司量
  • 还能点击「添加另一个配料」按钮来增加更多条目,完全符合你的需求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:42:55