【问题标题】:Questions about extending any Django app关于扩展任何 Django 应用程序的问题
【发布时间】:2012-07-11 17:46:49
【问题描述】:

我的老员工通过 PIP 安装了 Pinax,它安装在站点包中。所有的应用程序都在那里。我们自己的应用程序位于我们的 Django 项目结构中。

我想修改 Pinax 的帐户应用程序,将 create_useris_active 标志切换为 False。目前,该应用程序使其成为True。我还想为create_user 或我想做的任何功能添加额外的功能。

from pinax.account import forms
class MyCustomizeForm(forms.SignupForm):
   def create_user(....):
      super(....)
      // additional...

也许是这个? 但这不需要我至少做两个与 DB 对话的提交事务吗?

这样更好吗?此外,这样做是否需要我更改 Django 项目中的其他任何内容(用户如何注册、它使用什么视图……它使用什么形式)?

目前,我的 Django 项目中有一个应用程序应该处理 account 应用程序的扩展/自定义。我无法将站点包提交到 VCS.... 我的意思是.. 我不应该在那里进行任何更改。

谢谢。


Pinax 帐户/models.py

class Account(models.Model):
    ...
    def its_own_method(...)
# this is in the same indentation level as class Account

def create_account(sender, instance=None, **kwargs):
    if instance is None:
        return
    account, created = Account.objects.get_or_create(user=instance)

post_save.connect(create_account, sender=User)

【问题讨论】:

    标签: django django-forms pinax


    【解决方案1】:

    对于这种情况,您可以使用django signals。信号适用于需要普遍分发且并不总是知道如何将它们集成到项目中的应用。

    您感兴趣的信号是pre_save。您可以将 pre_save 连接到 pinax.account 模型,并在即将发生保存时收到通知。这将使您有机会对该模型实例进行更改。信号是同步的,这意味着您正在连续进行更改,就在 pinax.accounts 完成提交保存之前

    【讨论】:

    • 谢谢。您是说自定义操作将在 save() 实际被调用之前执行,还是在它完成到最后一行之前执行?
    • pre_save 信号将为您提供即将保存的模型实例。您有机会在该信号处理程序的上下文中修改它。您无需在该处理程序中调用 save 。它即将被保存,一旦完成所有 pre_save 信号就会被保存。
    • 谢谢。但是执行pre_save.connect(make_inactive, sender=User) 意味着每当User 模型执行保存时,它都会触发make_inactive 函数。我用 Pinax 帐户的信号更新了我的帖子。我应该怎么做?
    • @User007:如果实例是新的,它还没有pk 的值。因此,如果instance.pk is None,则仅与is_active 混淆。
    • 是的。如果您使用 pre_save 信号,每次保存都会调用它,因此您只需接受 Chris 的建议并检查您需要什么。只有新的才修改。
    猜你喜欢
    • 2017-11-18
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多