Получение значения поля изнутри класса модели
У меня есть класс Folder, который создает папку при инстанцировании, при этом поле 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 Admin, при создании папки проблем не возникает, однако если я перехожу и пытаюсь изменить ее, среди различных вариантов родительской_папки есть сама папка, и если я выбираю ее, возникает ошибка, потому что она пытается переименовать внутри себя.
Моя цель - удалить папку из списка папок, в которые я могу ее переместить. Я пытался использовать атрибут match поля FilePathField, но мне не удалось получить значение folder_name моего экземпляра (чтобы соответствовать любой папке, которая не содержит имя папки, которую я перемещаю).
Итак, если бы вы могли помочь мне получить значение folder_name моего экземпляра, я был бы очень признателен!
Я наконец нашел решение, которое потребовало от меня изменить поля Folder, так что это не совсем ответ на мой первоначальный вопрос, но это решило мою проблему, поэтому я поместил его здесь в случае, если это может помочь кому-то еще.
По сути, я изменил поле 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)
Теперь, когда у меня есть мои папки в форме ForeignKey, я могу изменить набор запросов и исключить саму папку из списка доступных папок, переопределив метод render_change_form, следующим образом :
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)