Показать сложную сущность в интерфейсе администратора Django - PullRequest
0 голосов
/ 26 марта 2011

Я застрял, пытаясь понять, как сделать следующее:

У меня есть несколько сущностей:

PurchaseItem (товар в корзине пользователя), Order (заказ - объединяет одинили много BuyItems), 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)

Ответы [ 2 ]

1 голос
/ 26 марта 2011

Part 1

Используйте Inlines , это очень просто, и Django превосходит это.

Part 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 голос
/ 26 марта 2011

Часть 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

...