Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django管理界面中显示复杂实体_Django_Django Models_Django Admin - Fatal编程技术网

在Django管理界面中显示复杂实体

在Django管理界面中显示复杂实体,django,django-models,django-admin,Django,Django Models,Django Admin,我一直在想如何做到以下几点: 我有几个实体: PurchaseItem(用户购物车中的项目), 订单(订单-组合一个或多个采购项目), OrderStatusHistory(这是订单的状态项-我创建了新的状态项,以便能够回顾性地预览状态随时间的变化) 我不想通过管理员创建任何这些,它们都是通过公共界面创建的,但我必须在管理员面板中显示顺序及其属性: 我需要能够显示订单列表。这很简单 当我单击订单或其他内容时,我希望能够查看订单的详细信息: 购买物品清单 我需要能够更改订单的状态-从下拉列表中进行

我一直在想如何做到以下几点:

我有几个实体:

PurchaseItem(用户购物车中的项目), 订单(订单-组合一个或多个采购项目), 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没有用于PurchaseItems的FK:

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部分:

您可以使用TableLine或StackedLine管理模型“嵌套”模型

class OrderAdmin(admin.ModelAdmin):
    model = Order
    inlines = [
        OrderStatusAdmin,
        PurchaseItemAdmin
    ]

class OrderStatusAdmin(admin.StackedInline):
    model = OrderStatus

class PurchaseAdmin(admin.StackedInline):
    model = PurchaseItem
更多信息可在此处找到:

第二部分:

我需要能够更改订单的状态-从下拉列表中进行选择或其他操作-但是,此操作可能会触发新的statusHistory项目创建

为此,您可以使用信号。有后保存和前保存。因此,每次保存订单时,都可以添加额外的逻辑。pre_save信号有一个发送方和一个实例,因此我认为您可以比较发送方和要保存的实例的状态,如果它发生了更改,您可以添加其他OrderStatus模型

更多信息可在此处找到:

第1部分 使用,这是非常直接的,django擅长这一点

第二部分 例如,确保可以覆盖保存并检查下拉项是否已更改。如果有,则生成订单状态历史记录对象

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!

内联线似乎不起作用-订单正在对PurchaseItems进行分组:PurchaseItems中有FK到订单,因为订单中可能有许多采购。但是admin中的内联线并不是这样工作的“类顺序没有ForeignKey到类PurchaseItems”如果反向使用内联线,PurchaseItems有一个外键到顺序。按照这封信的另一个答案,你会得到你的答案。按照我的方式获取已更改的状态消息。