Отображение "информации" путем выбора внешнего ключа в django admin

Я был представлен Python и Django около двух недель назад, так что терпите меня. Я должен также сказать, что сейчас я использую Django 1.6 и Python 3.3.

Мой проект - система управления заказами. Вот как это работает: покупатель заходит в магазин и заказывает товар. Этот товар помещается в заказ, который простаивает, пока работник не разместит заказ у поставщика. По сути, у меня есть таблица Order, которая собирает информацию, такую ​​как customer_name, order_date, status и т. Д. Затем у меня есть таблица EmployeeOrder (1-1 отношение к Order), которая содержит все элементы Order, но также принимает в себя employee_placed и employee_order_date (в значительной степени просто расширяет Order).

Я пытаюсь написать код, чтобы, когда пользователь выбирает, какой заказ клиента выполняется путем размещения EmployeeOrder, отображается информация о заказе клиента. Мне все равно, как это отображается прямо сейчас, всплывающее окно будет работать нормально. Я просто не знаю, как это сделать, и я нигде не сталкивался с этим. Прямо сейчас в выпадающем списке просто отображаются Заказ 1, Заказ 2 и т. Д. Пользователь не будет помнить, какие элементы были включены в какой заказ, поэтому я хочу, чтобы информация о заказе отображалась. В любом случае, вот мой код:

models.py

    class Order(models.Model):
       customer_order_date = models.DateTimeField('Date helped')
       customer_placed = models.ForeignKey(Customer)
       employee_helped = models.ForeignKey(Employee)

       STATUS_OF_ORDER = (
          ('IDLE', 'Not yet ordered'),
          ('SHIP', 'Awaiting delivery'),
          ('PICK', 'Ready for pickup'),
          ('UNAV', 'Unavailable for order'),
          ('BACK', 'Backordered - awaiting delivery'),
          ('CANC', 'Canceled by customer'),
          ('ARCH', 'Fulfilled - archived'),

       )

       status = models.CharField(max_length=4, choices=STATUS_OF_ORDER,
                                 default='IDLE', editable=False)
       paid = models.BooleanField('Paid', default=False)
       ship = models.BooleanField('Ship', default=False)
       comments = models.CharField(max_length=200, blank=True, null=True)
       item = models.ManyToManyField(Item)

       def __str__(self):
          return 'Order ' + str(self.id)

       def is_idle(self):
          return self.status == 'IDLE'

    class EmployeeOrder(models.Model):
       order = models.OneToOneField(Order, primary_key=True,
                                    limit_choices_to={'status': 'IDLE'})
       employee_order_date = models.DateTimeField('Date ordered')
       employee_placed = models.ForeignKey(Employee)

admin.py

    class OrderAdmin(admin.ModelAdmin):
       list_display = ('customer_order_date', 'customer_placed')
       raw_id_fields = ('customer_placed', 'item')    

    class EmployeeOrderAdmin(admin.ModelAdmin):
       list_display = ('employee_order_date', 'employee_placed')

Любая помощь приветствуется, так как я все еще признаю, что я абсолютный нуб, когда дело доходит до Python и Django!

1 ответ

Решение

Для меня это звучит так, будто вы хотите, чтобы сотрудник мог использовать сайт администратора для создания заказа сотрудника из заказа клиента. Я думаю, что это может быть так же просто, как добавить необработанное поле ID для заказа клиента. То есть я думаю, что вы можете просто изменить EmployeeOrderAdmin следующим образом:

class EmployeeOrderAdmin(admin.ModelAdmin):
    list_display = ('employee_order_date', 'employee_placed')
    raw_id_fields = ('order',)

Теперь, когда сотрудник создает заказ сотрудника, он сможет использовать страницу OrderAdmin, чтобы найти нужный заказ.

Кроме того, предположим, что вы хотите, чтобы это всплывающее окно отображало заказы определенным образом. В этом случае имейте в виду, что запросы на отображение этого всплывающего окна будут содержать дополнительный параметр GET, называемый pop, Вы могли бы:

class OrderAdmin(admin.ModelAdmin):
    def queryset(self, request):
        qs = super(ActiveOfferAdmin, self).queryset(request)
        if request.GET.get('pop'):
            return qs.order_by(...)
        return qs
Другие вопросы по тегам