0

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

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

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

我的modeladmin类是...

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', widget=SubjectField),
                FieldPanel('subject_template', widget=SubjectField),
                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", "sort_order", "date", "last_changed", "method_type", "field_name", "lookup_type", "field_value", "drip_id") VALUES ('33', '0', '2021-05-11 07:00:01.985938', '2021-05-11 07:00:01.985988', 'filter', 'is_subscribed', 'exact', '1', '10');
INSERT INTO "main"."drip_querysetrule" ("id", "sort_order", "date", "last_changed", "method_type", "field_name", "lookup_type", "field_value", "drip_id") VALUES ('34', '1', '2021-05-11 07:00:02.045635', '2021-05-11 07:00:02.045719', 'filter', 'last_login', 'gt', 'now-1 day', '10');

我什至尝试专门创建一个 EditView 类而没有填写任何默认的 InlineFields,并在 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 中的默认条目?

4

0 回答 0