【问题标题】:Django Admin list_display product listDjango Admin list_display 产品列表
【发布时间】:2017-08-25 05:12:40
【问题描述】:

我是 django 新手,我正在尝试修改一个项目来学习。

我在一个模型中有两个类(“Order”和“OrderItem”),OrderItem 类存储客户订单中选择的所有商品。

models.py

class Order(models.Model):

    STATUS_CHOICES = (
        (0, 'Waiting Payment'),
        (1, 'Completed'),
        (2, 'Canceled'),
    )

    PAYMENT_OPTION_CHOICES = (
        ('deposit', 'deposit'),
        ('paypal', 'Paypal'),
    )

    user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name='User')
    status = models.IntegerField(
        'Situation', choices=STATUS_CHOICES, default=0, blank=True
    )
    payment_option = models.CharField(
        'Payment Options', choices=PAYMENT_OPTION_CHOICES, max_length=20,
         default='deposit'
    )

    created = models.DateTimeField('Created in', auto_now_add=True)
    modified = models.DateTimeField('Modified in', auto_now=True)

    objects = OrderManager()

    class Meta:
        verbose_name = 'Order'
        ordering = ('-created',)

    def __str__(self):
        return 'Order #{}'.format(self.pk)

    def products(self):
        products_ids = self.items.values_list('product')
        return Product.objects.filter(pk__in=products_ids)

    def total(self):
        aggregate_queryset = self.items.aggregate(
            total = models.Sum(
                models.F('price') * models.F('quantity'),
                output_field = models.DecimalField()
            )
        )
        return aggregate_queryset['total']



class OrderItem(models.Model):

    order = models.ForeignKey(Order, verbose_name='Order',     related_name='items')
    product = models.ForeignKey('event.Product', verbose_name='Product')
    quantity = models.PositiveIntegerField('Quantity', default=1)
    price = models.DecimalField('Price', decimal_places=2, max_digits=8)

    class Meta:
        verbose_name = 'Order Item'

    def __str__(self):
        return '{}'.format(self.product)

在 django 管理员中,我可以显示所有订单,当我单击查看更多时,我会看到此订单上的所有产品,但我的问题是,我无法在我的 list_display 中列出 OrderItem 类的产品,我该怎么做那个?

admin.py

class OrderItemInline(admin.StackedInline):
    model = OrderItem
    fields = ['product']
    readonly_fields = ['product',]
    extra = 0
    max_num = 0


class OrderAdmin(admin.ModelAdmin):

    model = Order
    inlines = [ OrderItemInline, ]

    readonly_fieldsets = (
        (None, {
            'fields': ('user','status','order','created')
        }),
    )
    readonly_fields = ['user','status','payment_option']

    search_fields = ['user__name', 'user__email']
    list_filter = ['status', ]

    list_display = ['pk','user','status','created','product']
    ordering = ('-created',)


   admin.site.register(Order, OrderAdmin)

【问题讨论】:

    标签: python django django-admin


    【解决方案1】:

    这是一项简单的任务。在您的OrderAdmin 类中,从display_list 列表中删除product 并添加一个string that will be the name of a method/callable,例如list_products。现在,list_display 将显示该函数的返回值。

    例如,在OrderAdmin 类中定义一个list_products 方法。

    from django.utils.html import mark_safe
    
    
    class OrderAdmin(admin.ModelAdmin):
    
        list_display = ['pk', 'user', 'status', 'created', 'list_products']
    
        def list_products(self, obj):
            # each obj will be an Order obj/instance/row
            to_return = '<ul>'
            # I'm assuming that there is a name field under the event.Product model. If not change accordingly.
            to_return += '\n'.join('<li>{}</li>'.format(pro_name) for prod_name in obj.items.values_list('product__name', flat=True))
            to_return += '</ul>'
            return mark_safe(to_return)
    

    【讨论】:

    • 谢谢!正是如此,它帮助了很多。
    • 还有一点,“
    • {}
    • ”正在为每个角色创建一个主题。如果我更改 ' '.join(prod_name) 会显示 P R O D C T 1 P R O D U C T 2 而不是 PRODUCT1 PRODUCT2。
  • 更新了我的答案。现在请检查一下。
  • 谢谢,如果我想使用 search_field 搜索产品,我可以使用:search_fields = ['items__product']?
  • 我试过了,但是返回错误相关字段得到了无效的查找:icontains
  • 【解决方案2】:

    这是一项简单的任务。在您的 OrderAdmin 类中,从 display_list 列表中删除产品并添加一个字符串,该字符串将作为方法/可调用的名称,例如 list_products。现在,list_display 将显示该函数的返回值。

    例如,在 OrderAdmin 类中定义一个 list_products 方法:

    from django.utils.html import mark_safe
    
    class OrderAdmin(admin.ModelAdmin):
    
        list_display = ['pk', 'user', 'status', 'created', 'list_products']
    
        def list_products(self, obj):
            # each obj will be an Order obj/instance/row
            to_return = '<ul>'
            # I'm assuming that there is a name field under the event.Product model. If not change accordingly.
            to_return += '\n'.join('<li>{}</li>'.format(pro_name) for prod_name in obj.items.values_list('product__name', flat=True))
            to_return += '</ul>'
            return mark_safe(to_return)
    

    【讨论】:

      【解决方案3】:

      我知道了,我不知道是不是正确的。

      我先创建一个列表。

      def list_products(self, obj):
          products = []
          for prod_name in obj.items.values_list('product__name', flat=True):
              products.append(''.join(prod_name))
              to_return = '<br/>'.join(products)
          return mark_safe(to_return)
      

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签