如何创建模型层次结构?
How to create hierarchy of models?
如何在 Django 中创建层次结构?我想创建一棵人物树。我知道我应该将 parent 字段添加到 Person 模型。我需要在模型和视图中更改什么?另外我想用树视图来表示层次结构。
class Person(models.Model):
name = models.CharField(max_length=40)
def __str__(self):
return self.name
def add_person(request):
if(request.method == 'POST'):
name = request.POST['name']
person = Person(name=name)
person.save()
return redirect('/persons')
else:
return render(request, 'add_person.html')
如果给parent人加上外键,就可以轻松创建继承人
class Person(models.Model):
name = models.CharField(max_length=40)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
def __str__(self):
return self.name
def add_person(request):
if(request.method == 'POST'):
name = request.POST['name']
parent_id = request.POST.get('parent_id')
person = Person(name=name, parent_id=parent_id)
person.save()
return redirect('/persons')
else:
return render(request, 'add_person.html')
要获得一个人的所有 children 你可以简单地做
person = Person.objects.get(id=p_id)
person.children.all()
我不确定是否有内置的 TreeView,但您可以随时构建它
# view
def tree_view(request):
people = Person.objects.prefetch('children')
return render(request, 'template.html', {'people': people})
# template
<ul>
{% for person in people %}
<li>
{{ person.name }}
<ul>
{% for child in person.children.all %}
<li>{{ child.name }}</li>
{% endfor %}
</ul>
</li>
{% endif %}
</ul>
当然你可以创建多个模板并使用 include 使它们递归,这样你就可以有 n 代
如何在 Django 中创建层次结构?我想创建一棵人物树。我知道我应该将 parent 字段添加到 Person 模型。我需要在模型和视图中更改什么?另外我想用树视图来表示层次结构。
class Person(models.Model):
name = models.CharField(max_length=40)
def __str__(self):
return self.name
def add_person(request):
if(request.method == 'POST'):
name = request.POST['name']
person = Person(name=name)
person.save()
return redirect('/persons')
else:
return render(request, 'add_person.html')
如果给parent人加上外键,就可以轻松创建继承人
class Person(models.Model):
name = models.CharField(max_length=40)
parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
def __str__(self):
return self.name
def add_person(request):
if(request.method == 'POST'):
name = request.POST['name']
parent_id = request.POST.get('parent_id')
person = Person(name=name, parent_id=parent_id)
person.save()
return redirect('/persons')
else:
return render(request, 'add_person.html')
要获得一个人的所有 children 你可以简单地做
person = Person.objects.get(id=p_id)
person.children.all()
我不确定是否有内置的 TreeView,但您可以随时构建它
# view
def tree_view(request):
people = Person.objects.prefetch('children')
return render(request, 'template.html', {'people': people})
# template
<ul>
{% for person in people %}
<li>
{{ person.name }}
<ul>
{% for child in person.children.all %}
<li>{{ child.name }}</li>
{% endfor %}
</ul>
</li>
{% endif %}
</ul>
当然你可以创建多个模板并使用 include 使它们递归,这样你就可以有 n 代