【问题标题】:How to override Model defaults method of 3rd party installed app, django?如何覆盖第 3 方安装的应用程序 django 的模型默认方法?
【发布时间】:2017-06-20 13:54:36
【问题描述】:

我刚刚安装了this django-csvimport package。现在我想覆盖管理区域表单中的默认值。我找到了code here,它定义了模型,并包含了当前的默认文本:

class CSVImport(models.Model):
    """ Logging model for importing files """
    model_choice = []
    model_name = models.CharField(max_length=255, blank=False,
                                  default='csvimport.Item',
                                  help_text='Please specify the app_label.model_name',
                                  choices=get_models())
    field_list = models.TextField(blank=True,
                                  help_text='''Enter list of fields in order only if
                                     you dont have a header row with matching field names, eg.
                                     "column1=shared_code,column2=org(Organisation|name)"''')
    upload_file = models.FileField(upload_to='csv', storage=fs)
    file_name = models.CharField(max_length=255, blank=True)
    encoding = models.CharField(max_length=32, blank=True)
    upload_method = models.CharField(blank=False, max_length=50,
                                     default='manual', choices=CHOICES)
    error_log = models.TextField(help_text='Each line is an import error')
    import_date = models.DateField(auto_now=True)
    import_user = models.CharField(max_length=255, default='anonymous',
                                   help_text='User id as text', blank=True)

    def error_log_html(self):
        return re.sub('\n', '<br/>', self.error_log)
    error_log_html.allow_tags = True

    def __unicode__(self):
        return self.upload_file.name

例如,我想用其他东西覆盖model_name 字段默认csvimport.Item。我有点茫然如何覆盖它,因为我没有用于 csvimport 的应用程序文件夹,因为它是第三部分安装。这将是我第一次覆盖第三方安装的应用程序模型。

现在我对其进行了更多研究,不确定是否应该覆盖此模型,或者可能更好地覆盖 admin.py 文件的 ModelAdmin 类?

谢谢!

【问题讨论】:

  • 我认为最好的方法是在您的 django 项目中创建一个新应用程序。在那里,您可以在其 models.py 中导入上述 CSVImport 类,然后您可以对其进行子类化和使用。在这种情况下,您可以保持 django-csvimport 包不变。
  • 子类化在这里不起作用我看到了代码,它只知道导入自己的模型而不是其他任何模型。

标签: python django model overriding


【解决方案1】:
"""Your admin.py"""

from csvimport.models import CSVImport
from csvimport.admin import CSVImportAdmin

class MyCSVImportAdmin(CSVImportAdmin):
    """Override some of the form's field properties:
       clean, creation_counter, default_error_messages, 
       default_validators, disabled, empty_value, empty_values .. etc
    """

    def get_form(self, request, obj=None, **kwargs):
        form = super(MyCSVImportAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields["model_name"].initial = 'What you want'
        form.base_fields["model_name"].help_text = 'Please customize the fields however you like'
        return form

admin.site.unregister(CSVImport)
admin.site.register(CSVImport, MyCSVImportAdmin)

【讨论】:

  • 按上述方式进行定制相当简单,无需添加一些定制方法。
  • 抱歉,您在这里使用的是菜鸟,但我所有的 admin.py 文件都在其他应用程序中。这就是我的问题,在安装 csvimporter 后,我查看了我的项目,但看不到要编辑哪个文件,或者我是否需要创建一个新文件。 Csv Import 显示在管理部分,我不需要在任何管理文件中编码admin.site.register(CSVImport),那么我将在哪个管理文件中使用您的上述代码?
  • 如果您根本没有应用程序。然后您需要创建一个 django 应用程序并将上述内容作为 admin.py 文件添加到其中。请参阅docs.djangoproject.com/en/1.11/intro/tutorial01 示例民意调查应用程序有一个 admin.py
  • 所以基本上核心 django 管理命令 startapp myapp 创建一个带有管理文件的应用程序。您可以将 csvimport 设置复制到该设置,并使用对 csvimport 的任何自定义以及您可能想要的任何其他自定义内容运行您的应用程序,例如主页!
  • 哈,对不起,我当然有“一个应用程序”,我认为它在 django 中被称为“项目”。在我的项目中,我使用startapp 命令将所有功能组织到不同的应用程序中,这些被称为应用程序。将您的 csvimport 添加到我的项目后,它就像另一个应用程序一样工作,即在管理面板中有自己的部分。我指的是我没有app文件夹,因为我实际上并没有为csvimporter做startapp,它只是通过添加依赖项并将csvimport.app.CSVImportConf添加到主app文件夹中的settings.py文件来安装的。跨度>
【解决方案2】:

我看到了整个代码,django-csvimport 包没有为您提供覆盖其代码中任何内容的功能,因此如果不将应用程序复制到您的项目就无法覆盖。下面是另一个应用程序django-oauth-toolkit 的示例,它使用用户设置参数来提供修改功能。

USER_SETTINGS = getattr(settings, "OAUTH2_PROVIDER", None)

现在的解决方案是只复制应用程序,然后修改应用程序以供自己使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-29
    • 2013-06-05
    • 2021-11-21
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    相关资源
    最近更新 更多