Kapil Jain
Kapil Jain

Reputation: 188

Django call a funtion in model save method and call another function to fill value

I have a model in Django

class File(models.Model):
    NORMAL = 'normal'
    AD = 'ad'
    FILE_TYPE_CHOICES = (
        (NORMAL, 'Normal'),
        (AD, 'Ad'),
    )

    file_name = models.CharField(max_length=50)
    file_type = models.CharField(max_length=10, default=NORMAL,
        choices=FILE_TYPE_CHOICES)
    file_path = models.FileField('file', upload_to='documents/%Y/')
    duration = models.IntegerField()
    #prompt_id = models.CharField(max_length=50)

    def __unicode__(self):
        return self.file_name

    def save(self, *args, **kwargs):
        self.prompt_id = IvrUploadAudioFile(self.file_path)
        super(File, self).save(*args, **kwargs)

i have a column prompt_id in file table, but I don't want to show prompt_id field in add/edit. i Want to insert prompt_id value, which a function IvrUploadAudioFile will return behind the scene. so i am overriding save method here.

so where to write IvrUploadAudioFile function. how to write this situation

Upvotes: 1

Views: 1332

Answers (3)

thisisshantzz
thisisshantzz

Reputation: 1097

You can write it anywhere as long as it can be imported into your project.

from <insert_path_here> import IvrUploadAudioFile # Function written somewhere else. You need to insert the correct path here
from django.db import models

class File(models.Model):
    NORMAL = 'normal'
    AD = 'ad'
    FILE_TYPE_CHOICES = (
        (NORMAL, 'Normal'),
        (AD, 'Ad'),
    )

    file_name = models.CharField(max_length=50)
    file_type = models.CharField(max_length=10, default=NORMAL,
        choices=FILE_TYPE_CHOICES)
    file_path = models.FileField('file', upload_to='documents/%Y/')
    duration = models.IntegerField()
    #prompt_id = models.CharField(max_length=50, editable = False)

    def __unicode__(self):
        return self.file_name

    def save(self, *args, **kwargs):
        self.prompt_id = IvrUploadAudioFile(self.file_path)
        super(File, self).save(*args, **kwargs)

To make sure that the prompt_id field is not editable in the admin view, set the editable = False attribute when defining the prompt_id field in the model.

Upvotes: 1

Burhan Khalid
Burhan Khalid

Reputation: 174698

Django models are just normal Python classes, and you can add as many helper methods as you want to the class:

class File(models.Model):
    # -- normal stuff
    prompt_id = models.CharField(max_length=50, editable=False)

    def ivr_upload_audio_file(self):
        # do something with self.file_path
        return something

    def save(self, *args, **kwargs):
        self.prompt_id = self.ivr_upload_audio_file()
        super(File, self).save(*args, **kwargs)

As for your other question, about not showing the field - you can add editable=False to hide the field in the admin and any ModelForms - however, if you just want to hide it in the admin, but show it in other forms - you can customize your admin to not show that field:

@admin.register(File)
class FileAdmin(admin.ModelAdmin):
    fields = ('file_name', 'file_path', 'file_type', 'duration',)

Upvotes: 2

Brandon Taylor
Brandon Taylor

Reputation: 34593

If you're talking about wanting to hide the field in Django admin, you need to set it as editable=False: https://docs.djangoproject.com/en/1.7/ref/models/fields/#editable

class File(models.Model):
    . . .
    prompt_id = models.CharField(max_length=50, editable=False)

I'm not sure what you intend to do by passing self.file path to your IvrUploadAudioFile class, but the code, as written, will not return the primary key of that object.

Upvotes: 1

Related Questions