在Django Admin界面中显示复杂的实体
我卡住试图找出如何做到以下几点:
我有几个实体:
PurchaseItem(用户购物车中的物品),Order(一个订单 - 结合一个或多个PurchaseItems),OrderStatusHistory(这是订单的状态项 - 不是更改,而是创建新的可以回顾预览状态随时间变化的状态) 。
我不希望通过管理员创建任何这些内容 - 它们都是通过公共界面创建的,但我必须在管理面板中显示订单及其属性:
我需要能够显示订单列表。 这很简单。
当我点击订单或某件事情时,我希望能够查看订单的详细信息:采购物品清单。
我需要能够改变订单的状态 - 从下拉菜单中选择 - 但是,这个动作显示会触发一个新的statusHistory项目创建。
这一切都可能与管理界面,或者我应该忘记它,并创建我自己的实施与网页和所有?
我的模型如下所示:
class Order(models.Model):
dateCreated = models.DateTimeField(null=False,default=datetime.now())
items = models.ManyToManyField(PurchaseItem)
user_name = models.CharField(null=True,blank=True,max_length=200)
phone = models.CharField(null=False,blank=False,max_length=11,validators=[validate_phone])
phone_ext = models.CharField(null=True,blank=True,max_length=5,validators=[validate_phone_ext])
email = models.CharField(null=False,blank=False,max_length=100,validators=[validators.EmailValidator])
addressCity = models.CharField(null=False,blank=False,max_length=100)
addressStreet = models.CharField(null=False,blank=False,max_length=200)
notes = models.TextField(null=True,blank=True)
accessKey = models.CharField(max_length=32,default=CreateAccessKey())
class PurchaseItem(models.Model):
picture = models.ForeignKey(Picture, null=False)
paperType = models.CharField(null=False,max_length=200)
printSize = models.CharField(null=False,max_length=200)
quantity = models.IntegerField(default=1, validators=[validators.MinValueValidator(1)])
price = models.DecimalField(decimal_places=2,max_digits=8)
dateCreated = models.DateTimeField(null=False)
cost = models.DecimalField(decimal_places=2,max_digits=8)
class OrderStatusHistory(models.Model):
orderId = models.ForeignKey(Order)
dateSet = models.DateTimeField(null=False,default=datetime.now())
status = models.IntegerField(choices=OrderStatus,default=0,null=False,blank=False)
comment = models.TextField(null=True,blank=True)
以下内联安装程序不起作用,因为Order没有FK到PurchaseItems:
class OrderStatusHistoryAdmin(admin.StackedInline):
model = OrderStatusHistory
class PurchaseItemAdmin(admin.StackedInline):
model = PurchaseItem
class OrderAdmin(admin.ModelAdmin):
model = Order
inlines = [OrderStatusHistoryAdmin,PurchaseItemAdmin]
admin.site.register(Order,OrderAdmin)
第1部分
使用内联,这是非常直接的,Django擅长于此。
第2部分
当然,你可以覆盖你的保存例如,并检查下拉项目是否已经改变。 如果有,请生成您的订单状态历史记录对象。
def save(self, *args, **kwargs):
if self._initial_data['status'] != self.__dict__['status']:
self.orderstatushistory_set.create("Status Changed!")
super(Order, self).save(*args, **kwargs)
您也可以在ModelAdmin
做同样的事情
def save_model(self, request, obj, form, change):
if obj._initial_data['status'] != obj.__dict__['status']:
# create whatever objects you wish!
第1部分:
您可以使用TabularInline或StackedInline管理模型“嵌套”模型。
class OrderAdmin(admin.ModelAdmin):
model = Order
inlines = [
OrderStatusAdmin,
PurchaseItemAdmin
]
class OrderStatusAdmin(admin.StackedInline):
model = OrderStatus
class PurchaseAdmin(admin.StackedInline):
model = PurchaseItem
更多信息可以在这里找到:http://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects
第2部分:
我需要能够改变订单的状态 - 从下拉菜单中选择 - 但是,这个动作显示会触发一个新的statusHistory项目创建。
为此,您可以使用信号。 有一个post_save和pre_save。 所以每次保存订单时都可以添加额外的逻辑。 pre_save信号有一个发送者和一个实例,所以我认为你可以比较发件人和要保存的实例的状态,如果发生改变,你可以添加另一个OrderStatus模型。
更多信息可以在这里找到:http://docs.djangoproject.com/en/dev/ref/signals/#pre-save
链接地址: http://www.djcxy.com/p/65421.html上一篇: Show complex entity in Django Admin interface
下一篇: Django Admin Changing Inline Admin Form based on class type