Простое дерево с использованием Django и CSS

#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>]>