Django 管理界面中的 ManyToManyFields 作为 IntegerFields

ManyToManyFields as IntegerFields in Django admin interface

假设我有:

class Product(models.Model):
    [...]

class Basket(models.Model):
    content = models.ManyToManyField(Product, through="ProductQuantity")

class ProductQuantity(models.Model):
    basket = models.ForeignKey(Basket)
    product = models.ForeignKey(Product)
    quantity = models.IntegerField(default=0)

我如何为 Basket 模型渲染一个 ModelForm,并为 Basket 的每个 ProductQuantity 模型渲染一个字段,以便能够修改其 quantity 属性?

是否有我可以使用的小部件?

如果我能够用这样的 ModelForm 做这样的事情,我可以在 admin.ModelAdmin 中使用这个 ModelForm 作为替代 form 属性以在管理界面?

编辑:

@MuhammadTahir 将此 post 标记为 this post 的可能重复项。

它确实帮助我更好地理解,但我仍然卡住了:我无法渲染我想要渲染的字段。

到目前为止,这是我的代码:

models.py

同上

forms.py

ProductQuantityFormSet = inlineformset_factory(Product,
                                               basket.content.through,
                                               fields=("quantity",))

admin.py

class ProductQuantityInline(admin.StackedInline):
    model = ProductQuantity
    formset = ProductQuantityFormSet()

class BasketAdmin(admin.ModelAdmin):
    inline = [ProductQuantityInline,]

IRC 上有人发现了问题:

inlineinlines中的admin.ModelAdmin。我什至不需要 inlineformset_factory().

所以这是最终代码:

models.py

class Product(models.Model):
    [...]

class Basket(models.Model):
    content = models.ManyToManyField(Product, through="ProductQuantity")

class ProductQuantity(models.Model):
    basket = models.ForeignKey(Basket)
    product = models.ForeignKey(Product)
    quantity = models.IntegerField(default=0)

admin.py

class ProductQuantityInline(admin.StackedInline):
    model = ProductQuantity
    fields = ["quantity",]

class BasketAdmin(admin.ModelAdmin):
    inlines = [ProductQuantityInline,]

我希望这可以帮助其他人。 :)