如何覆盖Django可重用应用程序的模型?

时间:2012-09-23 07:09:34

标签: django django-models

我已经安装了一个django可重用的应用程序(Django-Userena),并且想要覆盖给定的models.py文件。

我创建了一个名为'accounts'的应用程序,可以从Django-Userena调用。在我的'accounts'应用程序中,我有这个models.py文件,它有一个继承自Django-Userena类的MyProfile类UserenaBaseProfile - 类MyProfile(UserenaBaseProfile)

在UserenaBaseProfile类中,有以下代码:

privacy = models.CharField(_('privacy'),
                           max_length=15,
                           choices=PRIVACY_CHOICES,
                           default=userena_settings.USERENA_DEFAULT_PRIVACY,
                           help_text = _('Designates who can view your profile.'))

我想用'editable = False'来增加隐私,因为我不希望这个字段显示在自动生成的表单中。

我尝试了几种方法,例如在MyProfile继承的模型中使用新设置再次调用隐私,但我只知道Django的“字段名称”隐藏“不允许”(https://docs.djangoproject.com/en /1.4/topics/db/models/#field-name-hiding-is-not-permitted)

我目前的解决方案是在下面调用类MyProfile(UserenaBaseProfile)之前,在我的'accounts'应用程序models.py中简单地包含整个UserenaBaseProfile类。

对我来说,这看起来不是一个优雅的解决方案。你们如何重写可重用应用程序中的models.py文件?

非常感谢。

1 个答案:

答案 0 :(得分:3)

在我看来,可以通过两种方式完成:

  1. 使用修改过的模型制作Django-Userena的分支,然后使用你的。

  2. 使用models.py制作一个Django-Userena包装器并使用你的包装器。

  3. 对于urls.py/views.py,您可以放置​​:

    #Your wrapper views:
    from django-userena.views import *
    
    #your wrapper urls:
    from django-userena.urls import *
    

    以下是您的模特:

    #your MODIFIED model:
    from django-userena.models import *
    # then put you new UserenaBaseProfile
    
    class UserenaBaseProfile(models.Model):
        #copy the model fields
        ...
        privacy = models.CharField(_('privacy'),
                           max_length=15,
                           choices=PRIVACY_CHOICES,
                           default=userena_settings.USERENA_DEFAULT_PRIVACY,
                           help_text = _('Designates who can view your profile.'))
    

    然后您可以在项目中使用自定义应用程序。

    如果要自定义模板,请在项目中创建模板目录,并将修改后的模板文件保存在原始名称中,这样django模板加载器可以首先找到您的模板文件(这取决于模板加载器的配置方式)你的settings.py)