#python #django #nested
#python #django #вложенные
Вопрос:
У меня есть приложение django с моделью под названием Folder, пользователь может создать папку с полем name. я хочу сделать эту модель папки вложенной, чтобы пользователь мог создавать папки внутри папки. Например, пользователь создал папку с именем ABC и попал в DetailView этой папки и создал другую папку DEF, а затем попал в DEF и создал другую папку с именем GHI и так далее.
Я довольно новичок в django, я связал поиск в Интернете, но ничего не получил.
models.py
from django.db import models
from django.contrib.auth.models import User
from django.db.models.deletion import CASCADE
from django.core.validators import MinValueValidator
from django.core.exceptions import PermissionDenied
# The Folders Model.
class Folder(models.Model):
name = models.CharField(max_length = 250)
cr_date = models.DateTimeField(auto_now_add = True)
def __str__(self):
return "%s" % self.name
views.py
import requests
from django.shortcuts import render
from django.views.generic.base import TemplateView
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.views.generic.list import ListView
from ahmed_drive.models import Folder
from . import models
from django.views.generic.detail import DetailView
from django.db.models import Q
from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django.http.response import HttpResponseRedirect
#### Normal Pages Related Views ####
class HomeView(TemplateView):
template_name = "ahmed_drive/home.html"
#### Pages Related Folder Model ####
@method_decorator(login_required, name="dispatch")
class FolderCreate(CreateView):
model = Folder
fields = ["name"]
def form_valid(self, form):
self.object = form.save()
self.object.save()
@method_decorator(login_required, name="dispatch")
class FolderListView(ListView):
model = Folder
def get_queryset(self):
si = self.request.GET.get("si")
if si == None:
si = ""
folderList = Folder.objects.filter(Q(name__icontains = si)).order_by("-id");
return folderList
@method_decorator(login_required, name="dispatch")
class FolderDetailView(DetailView):
model = Folder
Комментарии:
1. посетите документацию django-mptt, я думаю, это вам поможет. django-mptt.readthedocs.io/en/latest
Ответ №1:
Наиболее распространенный способ сделать это — использовать самореляционные ForeignKey
.
# The Folders Model.
class Folder(models.Model):
name = models.CharField(max_length = 250)
parent = models.ForeignKey('self')
cr_date = models.DateTimeField(auto_now_add = True)
def __str__(self):
return "%s" % self.name
Если вы хотите более продвинутое использование вложенных наборов, вы можете проверить django-mptt .