Я хочу вызвать get_queryset для объекта дважды в шаблоне представления. как мне это сделать? - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать веб-приложение, которое помогает изучать языки. На индексной странице (домашней странице) я хочу показать 2 раздела: «Последний словарь» и «Случайный словарь».

Следовательно, я хочу отфильтровать список словаря Spani sh, используя два фильтра отдельно. Первый - это упорядочить их по дате добавления в базу данных, а второй - рандомизировать и нарисовать 20 случайных слов. Я обнаружил, что get_queryset () - это способ выполнить первую фильтрацию, и я нашел еще один способ рандомизации из stackoverflow. Но проблема в том, что get_queryset () возвращает результат в context_object_name, и я полагаю, что может существовать только одно context_object_name. Поэтому я не знаю, как получить список random_spanish_list и отобразить его.

Вот код для страницы индекса.

{% if latest_spanish_list %}
<div class="flexcontainer">
    <div class="sectiontitle">Latest vocabulary
    </div>
    {% for spanish in latest_spanish_list %}
    <div class="card">
        <div class="cardinner" onclick="this.classList.toggle('flipped');">
            <div class="cardfront">
                <a href="{% url 'geniusdennis:detail' spanish.id %}">{{ spanish.word_esp }}</a>
                <form action="/deleteword/{{spanish.id}}/" method="post">{% csrf_token %}
                <input type="submit" value="Delete"/>
                </form>
            </div>
            {% for english in spanish.english_set.all %}
            <div class="cardback">
                <p>{{ english.word_eng}}</p>
            </div>
            {% endfor %}
        </div>
    </div>
    {% endfor %}
</div>
{% else %}
    <p>No Spanish words are available.</p>
{% endif %}
{% if random_spanish_list %}
<div class="flexcontainer">
    <div class="sectiontitle">Random vocabulary
    </div>
    {% for spanish in random_spanish_list %}
    <div class="card">
        <div class="cardinner" onclick="this.classList.toggle('flipped');">
            <div class="cardfront">
                <a href="{% url 'geniusdennis:detail' spanish.id %}">{{ spanish.word_esp }}</a>
                <form action="/deleteword/{{spanish.id}}/" method="post">{% csrf_token %}
                <input type="submit" value="Delete"/>
                </form>
            </div>
            {% for english in spanish.english_set.all %}
            <div class="cardback">
                <p>{{ english.word_eng}}</p>
            </div>
            {% endfor %}
        </div>
    </div>
    {% endfor %}
</div>
{% else %}
    <p>No Spanish words are available.</p>
{% endif %}

А вот код для шаблона IndexView.

class IndexView(generic.ListView):
    template_name = 'geniusdennis/index.html'
    context_object_name = 'latest_spanish_list'

    def get_queryset(self):
        """
        Return the last 20 Spanish words (not including those set to be
        published in the future).
        """
        return Spanish.objects.filter(
            pub_date__lte=timezone.now()
        ).order_by('-pub_date')[:20]

    def get_queryset(self):
        # grab the max id in the database
        max_id = Spanish.objects.order_by('-id')[0].id

        random_id = random.randint(1, max_id + 1)

        Spanish.objects.filter(id__gte=random_id)[0]

        return random_spanish

1 Ответ

0 голосов
/ 27 февраля 2020

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

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    # grab the max id in the database
    max_id = Spanish.objects.order_by('-id')[0].id
    random_id = random.randint(1, max_id + 1)
    random_spanish = Spanish.objects.filter(id__gte=random_id)[0]

    context['random_spanish_list'] = random_spanish
    return context

Тогда вы можете просто позвоните для al oop на random_spanish_list в вашем шаблоне

...