我在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)
我在文件表中有一个列prompt_id,但我不想在添加/编辑中显示prompt_id字段。 我想插入一个函数IvrUploadAudioFile将在场景后面返回的prompt_id值。所以我在这里重写了保存方法。
所以在哪里写IvrUploadAudioFile函数。 如何写这种情况
答案 0 :(得分:1)
如果您正在谈论想要在Django管理员中隐藏字段,则需要将其设置为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)
通过将self.file path
传递给IvrUploadAudioFile
类,我不确定您打算做什么,但编写的代码不会返回该对象的主键。
答案 1 :(得分:1)
Django模型只是普通的Python类,您可以根据需要添加任意数量的辅助方法:
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)
至于你的另一个问题,关于不显示该字段 - 您可以添加editable=False
来隐藏管理员和任何ModelForm
中的字段 - 但是,如果您只想将其隐藏在admin,但以其他形式显示 - 您可以自定义管理员以不显示该字段:
@admin.register(File)
class FileAdmin(admin.ModelAdmin):
fields = ('file_name', 'file_path', 'file_type', 'duration',)
答案 2 :(得分:1)
只要可以将其导入项目,您就可以在任何地方编写它。
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)
要确保在管理视图中不能编辑prompt_id字段,请在模型中定义prompt_id字段时设置editable = False属性。