显示"信息"通过在django admin中选择外键

时间:2014-03-25 15:53:37

标签: python django python-3.x django-models 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(几乎只是扩展订单)。

我尝试做的是编写代码,以便当用户通过放置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 个答案:

答案 0 :(得分:1)

在我看来,您希望员工能够使用管理网站从客户订单创建员工订单。我认为这可以像为客户订单添加原始ID字段一样简单。也就是说,我认为您可以像这样更改EmployeeOrderAdmin:

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

现在,当员工创建员工订单时,他们将能够使用OrderAdmin页面查找他们想要的订单。

此外,假设您希望该弹出窗口以特定方式显示订单。在这种情况下,请记住,显示该弹出窗口的请求将包含一个名为pop的附加GET参数。你可以:

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