#django #tree #django-templates #django-queryset
#django #дерево #django-шаблоны #django-набор запросов
Вопрос:
У меня есть три модели: User, student_group, классы
models.py
class User(AbstractBaseUser, PermissionsMixin):
username = models.CharField(_('username'), max_length=130, unique=True)
full_name = models.CharField(_('full name'), max_length=130, blank=True)
is_staff = models.BooleanField(_('is_staff'), default=False)
is_active = models.BooleanField(_('is_active'), default=True)
date_joined = models.DateField(_("date_joined"), default=date.today)
phone_number_verified = models.BooleanField(default=False)
change_pw = models.BooleanField(default=True)
phone_number = models.BigIntegerField(unique=True)
country_code = models.IntegerField(default=' 91')
two_factor_auth = models.BooleanField(default=False)
objects = UserManager()
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['full_name', 'phone_number', 'country_code']
class Meta:
ordering = ('username',)
verbose_name = _('user')
verbose_name_plural = _('users')
def get_short_name(self):
"""
Returns the display name.
If full name is present then return full name as display name
else return username.
"""
if self.full_name != '':
return self.full_name
else:
return self.username
class student_group(models.Model):
username = models.ForeignKey(User, on_delete=models.CASCADE)
schoolCode = models.ForeignKey(school, on_delete=models.CASCADE)
classVal = models.ForeignKey(classes, on_delete=models.CASCADE)
SECTION_CHOICES = ( ("A", 'Section -A'),("B", 'Section -B'),("C", 'Section -C'),("D", 'Section -D'),)
class_section = models.CharField(max_length=2,choices=SECTION_CHOICES,default="A")
class classes(models.Model):
class_id= models.CharField(primary_key=True,max_length=5)
classVal =models.CharField(max_length=255, null=True, blank=True)
Я хотел бы отобразить древовидную структуру в моем шаблоне, например
<classVal>
<class_section>
<Username.fullname username.phone>
<username.fullname username.phone>
<class_section B>
<Username.fullname username.phone>
<Username_fullname username.phone>
<classVal_id 2>
...............
Я попытался использовать «ul» и «li», используя вложенный цикл for. Но почему-то застрял и не смог напечатать значения.
Я попробовал django-treebeard, но показался немного сложным. Возможно ли распечатать данные с помощью набора запросов? Я хочу использовать сокращение URL https://bootsnipp.com/snippets/ypNAe для печати моих данных. Буду признателен за любую помощь. Пытаюсь выучить Django.
Комментарии:
1. Можете ли вы добавить свои модели и набор запросов? Возможно, вы сможете сделать это на уровне модели / запроса
Ответ №1:
Вы можете сделать что-то вроде этого :
views.py
from django.shortcuts import render
from my_app.models import classes
def my_view(request):
classes = classes.objects.all().prefetch_related('student_group_set__username')
return render(request, 'path/to/my_themplate.html', {
'classes': 'classes'
}
student_group_set
это обратный менеджер, который позволяет вам получить связанную student_group из экземпляра classe.
my_template.html
{% for classe in classes %}
<ul>
<li>
<span>{{ classe.classVal }}</span>
{% regroup classe.student_group_set.all by get_class_section_display as section_list %}
{% for section in section_list %}
<ul>
<li>
<span>{{ section.grouper }}</span>
<ul>
{% for user in section.list %}
<li>{{ user.username.username }} / {{ user.username.phone_number }}</li>
{% endfor %}
</ul>
</li>
</ul>
{% endfor %}
</li>
</ul>
{% endfor %}
Вы должны указать имя своего класса в PascalCase и единственном числе :
classes => StudentClass (to avoid Class which is a protected word
student_group => StudentGroup
Комментарии:
1. Я получил пустой список в моем html. <ul id=»tree1″> <li> <span></span> </li> </ul> <ul id=»tree1″> <li> <span></span> </li> </ul>
2. вы создали представление в соответствии с моим ответом?
3. определение addStudent(запрос): addStudentlink = True schoolval = user_school.objects.filter(username=request.user.id ).values_list(‘schoolCode’,flat=True)[0] studentclasses = studentclass.objects.all().prefetch_related(‘student_group_set__username’) печать (studentclasses) возврат рендеринга(запрос, ‘dashboard/add-student.html ‘, {‘studentclasses’: ‘studentclasses’}) — я также изменил классы на studentclass .
4. Я отредактировал свой ответ и заменил строку перегруппировки, вы можете попробовать еще раз?
5. Оно по-прежнему пустое. Даже {{classe.classVal}} пусто. Возможно, набор запросов (классы) необходимо изменить и добавить values() ? Когда я печатаю классы, я получаю <Набор запросов [<студенческий класс: класс V>, <студенческий класс: класс VI>, <студенческий класс: класс VIII>, <студенческий класс: класс IX>, <студенческий класс: класс XII>, <студенческий класс: класс X>, <студенческий класс: класс XI>, <студенческий класс: класс VII>]>