jeffery_the_wind
jeffery_the_wind

Reputation: 18218

How to override Model defaults method of 3rd party installed app, django?

I just installed this django-csvimport package. Now I want to override the default values in the Admin area form. I found the code here, which defines the models, and contains the current default text:

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

So for example I would like override the model_name field default csvimport.Item with something else. I am a bit at a loss how to override this as I do not have an app folder for csvimport, as its a 3rd part installation. It will be my first time overriding a 3rd party installed app model.

Now that I look into it a bit more, not sure if I should override this model or perhaps better the ModelAdmin class of the admin.py file?

Thanks!

Upvotes: 1

Views: 1261

Answers (2)

Ed Crewe
Ed Crewe

Reputation: 46

"""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)

Upvotes: 2

Arpit Solanki
Arpit Solanki

Reputation: 9931

I saw the whole code and django-csvimport package does not provide you the functionality to override anything from their code so its not possible to override without copying app to your project. Below is an example of another app django-oauth-toolkit which uses a user settings param to provide the functionality of modifications.

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

Now the solution would be only to copy the app and then modify the app for your own usage.

Upvotes: 1

Related Questions