从模型内部获取字段值 class
Get field value from inside the model class
我有一个文件夹 class,它在实例化时创建一个文件夹,parent_folder 字段是我希望创建文件夹的位置。
class Folder(models.Model):
folder_name = models.CharField(max_length=200, unique=True)
parent_folder = models.FilePathField(path=r'media/', allow_files=False, allow_folders=True, recursive=True)
def __init__(self, *args, **kwargs):
super(Folder, self).__init__(*args, **kwargs)
self.initial_filepath = self.filepath()
def save(self, *args, **kwargs):
on_creation = self.pk is None
if on_creation:
os.mkdir(self.filepath())
else:
os.rename(self.initial_filepath, self.filepath())
super(Folder, self).save(*args, **kwargs)
def filepath(self):
return os.path.join(self.parent_folder, self.folder_name)
当我转到 Django 管理页面时,创建文件夹没有问题,但是如果我尝试修改它,在 parent_folder 的不同选择中,有文件夹本身,如果我 select 它会导致错误,因为它会尝试在自身内部重命名。
然后我的目标是从我可以移动它的文件夹列表中删除该文件夹。我尝试使用 FilePathField 的 match 属性,但我没有设法获得实例的 folder_name 的值(以匹配任何不包含我要移动的文件夹名称的文件夹。
因此,如果您能帮助我获取实例的 folder_name 的值,将不胜感激!
我终于找到了一个解决方案,它要求我修改我的文件夹字段,因此它并没有真正回答我最初的问题,但它解决了我的问题,所以我把它放在这里以防万一可以帮助别人。
所以基本上,我将 parent_folder 字段从 FilePathField 更改为 Folder ForeignKey,如果我想将文件夹放在根文件夹中,可以将其留空:
class Folder(models.Model):
folder_name = models.CharField(max_length=200)
parent_folder = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True)
现在我的文件夹采用外键形式,我可以修改查询集并通过覆盖 render_change_form[=19 将文件夹本身从可用文件夹列表中排除=] 方法,像这样:
class FolderAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['folder_name']}),
('Parent Folder', {'fields': ['parent_folder']}),
]
list_display = ('folder_name', '__str__')
def render_change_form(self, request, context, *args, **kwargs):
context['adminform'].form.fields['parent_folder'].queryset = Folder.objects.exclude(id=context['object_id'])
return super(FolderAdmin, self).render_change_form(request, context, *args, **kwargs)
我有一个文件夹 class,它在实例化时创建一个文件夹,parent_folder 字段是我希望创建文件夹的位置。
class Folder(models.Model):
folder_name = models.CharField(max_length=200, unique=True)
parent_folder = models.FilePathField(path=r'media/', allow_files=False, allow_folders=True, recursive=True)
def __init__(self, *args, **kwargs):
super(Folder, self).__init__(*args, **kwargs)
self.initial_filepath = self.filepath()
def save(self, *args, **kwargs):
on_creation = self.pk is None
if on_creation:
os.mkdir(self.filepath())
else:
os.rename(self.initial_filepath, self.filepath())
super(Folder, self).save(*args, **kwargs)
def filepath(self):
return os.path.join(self.parent_folder, self.folder_name)
当我转到 Django 管理页面时,创建文件夹没有问题,但是如果我尝试修改它,在 parent_folder 的不同选择中,有文件夹本身,如果我 select 它会导致错误,因为它会尝试在自身内部重命名。
然后我的目标是从我可以移动它的文件夹列表中删除该文件夹。我尝试使用 FilePathField 的 match 属性,但我没有设法获得实例的 folder_name 的值(以匹配任何不包含我要移动的文件夹名称的文件夹。
因此,如果您能帮助我获取实例的 folder_name 的值,将不胜感激!
我终于找到了一个解决方案,它要求我修改我的文件夹字段,因此它并没有真正回答我最初的问题,但它解决了我的问题,所以我把它放在这里以防万一可以帮助别人。
所以基本上,我将 parent_folder 字段从 FilePathField 更改为 Folder ForeignKey,如果我想将文件夹放在根文件夹中,可以将其留空:
class Folder(models.Model):
folder_name = models.CharField(max_length=200)
parent_folder = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True)
现在我的文件夹采用外键形式,我可以修改查询集并通过覆盖 render_change_form[=19 将文件夹本身从可用文件夹列表中排除=] 方法,像这样:
class FolderAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['folder_name']}),
('Parent Folder', {'fields': ['parent_folder']}),
]
list_display = ('folder_name', '__str__')
def render_change_form(self, request, context, *args, **kwargs):
context['adminform'].form.fields['parent_folder'].queryset = Folder.objects.exclude(id=context['object_id'])
return super(FolderAdmin, self).render_change_form(request, context, *args, **kwargs)