如何使用 Django 管理员的 ContentTypes 在两个应用程序之间访问 ManyToManyField?
Posted
技术标签:
【中文标题】如何使用 Django 管理员的 ContentTypes 在两个应用程序之间访问 ManyToManyField?【英文标题】:How to access a ManyToManyField between two apps using ContentTypes for Django admin? 【发布时间】:2016-05-06 18:17:13 【问题描述】:假设我有一个名为 Pantry 的应用程序,它可以连接到我可能使用的任何其他应用程序。为了保持应用程序解耦,通过模型 LinkedItem 使用通用关系,该模型将成分模型连接到 Pantry 外部的应用程序。
我可以在 Django 中为 LinkedItem 的管理员显示 filter_horizontal。现在我希望通用关系另一端的内容,比如一个名为 Bakery 的应用程序,能够对成分进行 filter_horizontal。
储藏室 models.py
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import fields
class Ingredient(models.Model):
'''
Model containing all the ingredients, their slugs, and their descriptions
'''
name = models.CharField(unique=True, max_length=100)
slug = models.SlugField(unique=True, max_length=100)
description = models.CharField(max_length=300)
# method to return the name of the db entry
def __str__(self):
return self.name
class LinkedItem(models.Model):
'''
Model that links ingredients to various other content models
'''
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = fields.GenericForeignKey('content_type', 'object_id')
ingredient = models.ManyToManyField(Ingredient)
# method to return the name of the db entry
def __str__(self):
return self.ingredient.name
# defines options for the model itself
class Meta:
unique_together = (('content_type','object_id')) # prevents duplicates
面包店 admin.py
from django.contrib import admin
from bakery.models import Cake
class CakeAdmin(admin.ModelAdmin):
filter_horizontal = ('') # what to put here so ingredients show up?
有什么想法吗?
【问题讨论】:
你想好如何实现这些场景了吗? @DipakChandranP 我最近确实想出了一种方法来做到这一点。刚刚添加了一个包含详细信息的答案。 【参考方案1】:解决方案是为 LinkedItem 创建一个GenericTabularInline,并对显示设置一些限制以避免重复,如下所示:
from django.contrib.contenttypes.admin import GenericTabularInline
class LinkedItemAdmin(GenericTabularInline):
model = LinkedItem
# choosing the field and display
field = ['ingredient']
filter_horizontal = ['ingredient']
# These help with removing some potential issues in the admin
extra = 0
min_num = 1
max_num = 1
can_delete = False
然后在 CakeAdmin 中我可以这样做以显示成分。
class CakeAdmin(admin.ModelAdmin):
inlines = [LinkedItemAdmin]
【讨论】:
是的,对我的场景也有帮助。谢谢。 :)以上是关于如何使用 Django 管理员的 ContentTypes 在两个应用程序之间访问 ManyToManyField?的主要内容,如果未能解决你的问题,请参考以下文章
Django学习之django自带的contentType表
无法将 ajax json 发布请求发送到 django 视图