【问题标题】:Displaying "info" by selecting foreign key in django admin通过在 django admin 中选择外键来显示“信息”
【发布时间】:2014-03-25 15:53:36
【问题描述】:

大约两周前我被介绍给 Python 和 Django,所以请耐心等待。我现在也应该说我正在使用 Django 1.6 和 Python 3.3。

我的项目是一个订单管理系统。它是这样工作的:客户进入商店并订购商品。该项目被放入订单中,该订单处于空闲状态,直到员工向供应商下订单。基本上,我有一个 Order 表,它收集诸如 customer_name、order_date、status 等信息。然后我有一个 EmployeeOrder 表(与 Order 的 1-1 关系),它包含 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 方面完全是菜鸟!

【问题讨论】:

    标签: python django python-3.x django-models django-admin


    【解决方案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
    

    【讨论】:

    • 你知道什么..效果很好!我想多了!我想我只是想,因为没有多少订单可供选择(至少在理论上),一个下拉框就可以了。不幸的是,您在使用下拉菜单时看不到订单中的任何数据。非常感谢!
    • 太棒了!我就是这样做的。我相信下拉框会显示对象的 __str__ 或 __unicode__ 方法返回的任何内容,但我通常会尽量避免将这些方法用于调试以外的任何事情。
    • 你的想法是正确的。就像我说的,它不是很具有描述性。这种方式要好很多。现在我只需要处理我的连接表,以便项目名称按顺序显示。
    • 我想我知道你在说什么。我在答案中添加了一个提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2012-07-05
    • 2019-01-21
    • 1970-01-01
    • 2020-01-10
    • 2016-11-12
    相关资源
    最近更新 更多