Как отобразить содержимое в формате grid в шаблоне django при получении динамических данных в виде списка из базы данных?

#django #django-models #django-views #django-templates

#django #django-модели #django-просмотры #django-шаблоны

Вопрос:

В модели django я создал multiselectfield для предположительного списка пожеланий, где пользователь может выбрать несколько пожеланий из доступных вариантов.

Я сохраняю эти данные в формате, разделенном запятыми, когда дело доходит до отображения этого в шаблоне, все довольно просто.

Но я хочу, чтобы эти данные отображались динамически в виде одной строки с двумя столбцами, и как только будут заполнены два столбца и останется больше данных для отображения, логика должна иметь возможность создать новую строку и отобразить оставшееся содержимое в шаблоне django.

Для справки:

 # models.py
class Wishlist(models.Model):
    wishlist = (
        ('W1',"Buy a big masion"),
         ('W2',"Buy worlds fastest car"),
          ('W3',"Visit Europe"),
           ('W4',"Travel on bike to mountains")
    )
    
    your_wishlist = MultiSelectField(choices=wishlist)

# views.py
def index(request):
    wishlist = Wishlist.objects.all()
    context = {
        "wishlist":wishlist
    }
    return render(request,'demolistingapp/index.html',context)

# index.html
{% load app_filters %}
{% block content %}
<h1>INDEX LISTING APP</h1>
{% if wishlist %}
    {% for each_wish in wishlist %}
       {% with  each_wish.your_wishlist|split:"," as wish %}
            {% for mywish in wish %}
                <p>{{mywish}}</p><br>
            {% endfor %}
       {% endwith %}
    {% endfor %}
{% endif %}
{% endblock %}
  

Я зарегистрировал разделение пользовательского фильтра, которое возвращает список.
Я хочу, чтобы данные отображались в виде сетки путем сохранения двух столбцов.

Пример вывода: введите описание изображения здесь

Ответ №1:

Вы могли бы использовать цикл в шаблонах для создания другого класса:

 <p class="{% cycle row_left row_right %}">{{ mywish }}</p>
  

с соответствующим css (float / clear или inline-block; ширина: 50%).

Ответ №2:

Я бы обернул ваш внешний цикл for в HTML-элемент с классом, а затем применил макет сетки к этому классу в вашей таблице стилей. Обертывание каждого желания в элементе div с определенным классом также поможет вам с дальнейшим оформлением.

 <div class="wishlist">
    {% for each_wish in wishlist %}
       {% with  each_wish.your_wishlist|split:"," as wish %}
            {% for mywish in wish %}
                <div class="wish">
                    <p>{{mywish}}</p>
                </div>
             {% endfor %}
       {% endwith %}
    {% endfor %}
</div>
  

И в вашем CSS:

 .wishlist {
    display: -ms-grid;
    display: grid;
    -ms-grid-columns: 1fr 1fr;
    grid-template-columns: 1fr 1fr;
}