微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Wagtail ModelAdmin 中可排序的 InlineFields 中的条件默认条目

如何解决Wagtail ModelAdmin 中可排序的 InlineFields 中的条件默认条目

我已经在 Wagtail 中实现了 django-drip 应用程序,并且除了一个小问题之外,所有的功能都交给了 Wagtail 的 ModelAdmin。

对于那些可能不熟悉它的阅读者,它会按照它的建议执行……根据用户模型查询集规则发送滴灌营销电子邮件。它通过管理员创建/编辑视图中的可排序 InlineFields 来实现这一点,允许用户输入一个或多个排序规则,这些规则在向用户发送邮件时可能与用户匹配。

当然,我想要一个“是否订阅?”的属性。与 is_subscribed 的布尔模型字段匹配,这将从滴灌应用程序发送的未来电子邮件中排除已取消订阅营销电子邮件用户

我的模型管理员类是...

class DripAdmin(ModelAdmin):
    model = Drip
    menu_icon = 'fa-tint'
    menu_label = 'Drip Email'
    list_display = ('name','enabled','last_changed')
    create_view_class = DripAdminCreateView

    panels = [
        MultiFieldPanel(
            [
                FieldPanel('name',widget=SubjectField),FieldPanel('enabled'),FieldPanel('from_email'),FieldPanel('from_email_name',FieldPanel('subject_template',FieldPanel('body_html_template',widget=SummernoteInplaceWidget),InlinePanel('queryset_rules',label='Query Set Rules'),],_('Drip Admin'),)
    ]

我像这样在我的 CreateView 条件函数上设置了一个打印语句,它按预期工作......

class DripAdminCreateView(CreateView):
    def get_instance(self):
        instance = super().get_instance()
        # default values for first query rules InlinePanel to only match subscribed users
        if instance.queryset_rules.exists():
            print('true')
        else:
            instance.queryset_rules = [
                    QuerySetRule(method_type='filter',field_name='is_subscribed',lookup_type='exact',field_value=1,sort_order=0)
            ]
            print('false')
        
        return instance

在创建新的滴灌电子邮件模板时,调试服务器返回 false,并将认规则附加到 CreateView 函数中指定的 InlineField 查询集规则集。

问题是,当我编辑刚刚创建的模板时,认规则在那里两次......这是查询集的 sql 转储有问题:

INSERT INTO "main"."drip_querysetrule" ("id","sort_order","date","last_changed","method_type","field_name","lookup_type","field_value","drip_id") VALUES ('32','0','2021-05-11 07:00:01.843932','2021-05-11 07:00:01.940603','filter','is_subscribed','exact','1','10');
INSERT INTO "main"."drip_querysetrule" ("id","drip_id") VALUES ('33','2021-05-11 07:00:01.985938','2021-05-11 07:00:01.985988',"drip_id") VALUES ('34','2021-05-11 07:00:02.045635','2021-05-11 07:00:02.045719','last_login','gt','Now-1 day','10');

我什至尝试在没有填充任何认 InlineFields 的情况下专门创建一个 EditView 类,并测试 CreateView 中的逻辑,看起来没问题...

class DripAdmineditView(EditView):
    def get_instance(self):
        instance = super().get_instance()
        if instance.queryset_rules.exists():
            print('true')
        else:
            print('false')
        return instance

调试控制台说:

true
true
true
true
[11/May/2021 02:09:02] "GET /admin/drip/drip/edit/10/ HTTP/1.1" 200 51466

在创建时,它说:

false
false
false
false
[11/May/2021 02:10:07] "GET /admin/drip/drip/create/ HTTP/1.1" 200 42503

那么,如果我的条件按预期工作,为什么要复制 InlineField 中的认条目?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。