Python Django |使用猴子补丁在第三方软件包中添加/更改代码

Python Django |使用猴子补丁在第三方软件包中添加/更改代码,python,django,email,monkeypatching,Python,Django,Email,Monkeypatching,(+/-3个月的Django工作经验) 我正在使用django新闻稿软件包创建新闻稿,并将其发送给我网站上的订户。它使用一个message.html模板,提交模型中添加了该模板的上下文: class Submission(models.Model): # Some irrelevant code, only showing the send_message method below: def send_message(self, subscription):

(+/-3个月的Django工作经验)

我正在使用
django新闻稿
软件包创建新闻稿,并将其发送给我网站上的订户。它使用一个
message.html
模板,提交模型中添加了该模板的上下文:

class Submission(models.Model):
    
    # Some irrelevant code, only showing the send_message method below:
 
    def send_message(self, subscription):
        variable_dict = {
            'subscription': subscription,
            'site': Site.objects.get_current(),
            'submission': self,
            'message': self.message,
            'newsletter': self.newsletter,
            'date': self.publish_date,
            'STATIC_URL': settings.STATIC_URL,
            'MEDIA_URL': settings.MEDIA_URL
        }
    
    unescaped_context = get_context(variable_dict, autoescape=False)

    subject = self.message.subject_template.render(
        unescaped_context).strip()
    text = self.message.text_template.render(unescaped_context)

    message = EmailMultiAlternatives(
        subject, text,
        from_email=self.newsletter.get_sender(),
        to=[subscription.get_recipient()],
        headers=self.extra_headers,
    )

    if self.message.html_template:
        escaped_context = get_context(variable_dict)

        message.attach_alternative(
            self.message.html_template.render(escaped_context),
            "text/html"
        )
        # some more code irrelevant to the question
        
        message.send()
基本上,在提交时事通讯时,上下文将添加到Submission.send_message方法的变量_dict中

为了添加更多个性化的可能性,我想添加我自己的上下文变量。据我所知,最好使用monkey补丁来实现这一点,但我无法从方法本身外部访问变量_dict。下面是我的猴子补丁代码:

## Monkey Patching ##
# monkey_patches.py

DJANGO_NEWSLETTER_CONTEXT_PATCH = True  # adds context to Submission


def monkey_patch():
    if DJANGO_NEWSLETTER_CONTEXT_PATCH:
        from newsletter.models import Submission
        old_send_message = Submission.send_message

        def new_send_message(self, *k, **kw):
            old_send_message(self, *k, **kw)
            # trying to append to variable dict here, but failing:
            print(variable_dict)  # gives error
            # self.send_message.variable_dict['test'] = 'testvalue' # gives error
            # variable_dict['test'] = 'testvalue' # gives error

        Submission.send_message = new_send_message

# apps.py
from django.apps import AppConfig


class SomeAppConfig(AppConfig):
    name = 'SomeApp'

    def ready(self):
        try:
            from SomeApp.monkey_patches import monkey_patch
            monkey_patch()
        except ImportError:
            pass
非常感谢你的帮助。欢迎任何指点