Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 计算字段上的自定义ModelAdmin筛选器_Django_Wagtail_Modeladmin - Fatal编程技术网

Django 计算字段上的自定义ModelAdmin筛选器

Django 计算字段上的自定义ModelAdmin筛选器,django,wagtail,modeladmin,Django,Wagtail,Modeladmin,我试图模仿的示例: 位于/admin/gallery/galleryitem的字段错误/ 无法将关键字“on_sale”解析为字段 选项包括:内容类型、内容类型、id、深度、描述、直销、直销、额外描述、直销价格、草稿标题、过期、外部链接、首次发布的位置、表单提交、图库图像、上线的位置、组权限、有无未发布的更改、id、索引条目、最后发布的位置、,最新版本创建、实时、实时、实时版本、实时版本id、锁定、锁定、锁定、锁定、锁定id、numchild、所有者、所有者id、页面ptr、页面ptr、页面p

我试图模仿的示例:

位于/admin/gallery/galleryitem的字段错误/ 无法将关键字“on_sale”解析为字段

选项包括:内容类型、内容类型、id、深度、描述、直销、直销、额外描述、直销价格、草稿标题、过期、外部链接、首次发布的位置、表单提交、图库图像、上线的位置、组权限、有无未发布的更改、id、索引条目、最后发布的位置、,最新版本创建、实时、实时、实时版本、实时版本id、锁定、锁定、锁定、锁定、锁定id、numchild、所有者、所有者id、页面ptr、页面ptr、页面ptr id、路径、重定向、修订、搜索描述、搜索引擎优化标题、在菜单中显示、网站根目录、slug、股票、标题、url路径、视图限制、工作流状态、工作流页面

models.py

class GalleryItem(Page):
    parent_page_types = ['InstallationPage']

    description = models.CharField(blank=True, max_length=250)
    direct_sale = models.BooleanField("On Sale", default=False, help_text="Check this box to list this item for sale directly on your website.")
    direct_sale_price = models.DecimalField("Sale price, $", blank=True, null=True, max_digits=6, decimal_places=2, help_text="Add more info about this item for the store page only.")
    direct_sale_extra_description = models.CharField("Addtional sale description (optional)", blank=True, max_length=250, )
    stock = models.IntegerField("Number in stock", blank=True, null=True,)

    def external_sale(self):
        return bool(self.external_links.count())

    def on_sale(self, obj):
        return obj.external_sale or obj.direct_sale

class ExternalLink(Orderable):
    gallery_item = ParentalKey(GalleryItem, on_delete=models.CASCADE, related_name='external_links', help_text="Add details about the listing, ex. dimensions, framing.")
    description = models.CharField(blank=True, max_length=250)
    external_sale_url = models.URLField(blank=True, help_text="Add an external link to sell this.")
摇尾钩

class OnSaleFilter(SimpleListFilter):
    title = 'On Sale'
    parameter_name = 'on_sale'

    def lookups(self, request, model_admin):
        return (
            ('Yes', 'Yes'),
            ('No', 'No'),
        )

    def queryset(self, request, queryset):
        value = self.value()
        if value == 'Yes':
            return queryset.filter(on_sale=True)
        elif value == 'No':
            return queryset.filter(on_sale=False)
        return queryset

class GalleryItemAdmin(ThumbnailMixin, ModelAdmin):
    model = GalleryItem
    menu_label = 'All Gallery Items'  # ditch this to use verbose_name_plural from model
    menu_icon = 'pick'  # change as required
    menu_order = 200  # will put in 3rd place (000 being 1st, 100 2nd)
    add_to_settings_menu = False  # or True to add your model to the Settings sub-menu
    exclude_from_explorer = False # or True to exclude pages of this type from Wagtail's explorer view
    list_display = ('title', 'admin_thumb', 'description', 'direct_sale', 'external_sale')
    list_filter = (OnSaleFilter, InstallationFilter,)
    list_per_page = 50
    search_fields = ('title', 'description')
    thumb_image_field_name = 'main_image'
    thumb_image_width = 100

只需将计算添加到查询集中。 例如新闻>状态:

#_____________________________________________________________________________
class NewsItem(models.Model):
    objects = NewsItemQuerySet.as_manager()


#_____________________________________________________________________________
class NewsItemQuerySet(models.query.QuerySet):

    def with_status_key(self):
        now = timezone.now()
        queryset = self.select_related('parent')
        queryset = queryset.annotate(
            status_key = Case(
                When(go_live_at__gt=now, then=Value(0)), # pending
                When(go_live_at__lte=now, expire_at__gte=now, then=Value(1)), # running
                default=Value(2), # archived
                output_field=IntegerField(),
            )
        ).order_by('status_key', 'go_live_at', 'expire_at')
        return queryset
或者可能:

from wagtail.core.models import PageManager

#_____________________________________________________________________________
class MyManager(PageManager):

    def get_queryset(self):
        return super().get_queryset()

    def with_status_key(self):
        queryset = self. get_queryset().select_related('parent')
        etc