Pergunta

Eu quero implementar Guias Bootstrap3 No meu aplicativo, que exibe dados escolares por estado. Portanto, se você for para exemplo.com/ma/ verá informações para o estado de Massachusetts e guias para classificar por nível de série.

Já estou usando o Queryset para filtrar por estado, para que, no exemplo.com/ma/ somente os resultados "MA" apareçam. E posso mostrar todos os dados em uma das guias, mas não consigo filtrá -los para várias guias. Para simplificar, eu só quero fazer guias para "All" e "High School" aqui.

Aqui está o meu models.py: de Django.db Modelos de importação

class School(models.Model):
    school_name = models.CharField(max_length=200)
    location_state  = models.CharField(max_length=2)
    grades = models.CharField(max_length=20)

Aqui está o meu modelo para state.py:

{% extends 'base.html' %}

{% block content %}

<h2>{{ state }}</h2> #This works and shows the state based on the URL

<div class="row">
    <div class="col-12 col-sm-12 col-lg-12">
    <ul class="nav nav-tabs" id="myTab">
        <li class="active"><a href="#all">All</a></li>
        <li><a href="#high">High School</a></li>
    </ul>
    </div>

{% for school in schools_by_state %}
<div id="content" class="tab-content">
    <div class="tab-pane active" id="all">
    <ul>
        <li>{{ school.school_name }}</li>
    </ul>
    </div>
    <div class="tab-pane" id="high">
    <ul>
        <li>{{ ???highschool??? }}</li>
    </ul>
    </div>  
</div><!-- end content -->
</div><!-- end row -->
{% endfor %}

{% endblock content %}

E aqui está o meu Views.py:

from django.views.generic import ListView

from .models import School

class StateListView(ListView):
    model = School
    template_name = 'state.html'
    context_object_name = 'schools_by_state'

    def get_queryset(self):
        state_list = self.kwargs['location_state']
        return School.objects.filter(location_state=state_list)

    def get_context_data(self, **kwargs):
        context = super(StateListView, self).get_context_data(**kwargs)
        context.update({'state': self.kwargs['location_state']})
        return context

Para completude, aqui está o urls.py Para esta visão:

url(r'^(?P<location_state>[A-Z]{2})/$', StateListView.as_view()),

Não acredito que quero usar várias consultas aqui, mas encontre uma maneira de adicionar um filtro adicional ao meu context_data na visualização do "Highschool", que posso adicionar ao meu modelo. No entanto, minhas tentativas de adicionar filtros de contexto adicionais falharam. Pensamentos?

Foi útil?

Solução

Você pode simplesmente adicionar uma nova consulta ao contexto:

def get_context_data(self, **kwargs):
    context = super(StateListView, self).get_context_data(**kwargs)
    context.update({'state': self.kwargs['location_state']})

    context['schools_highschool'] = context['schools_by_state'].filter(grades='9-12')

    return context

Depois loop schools_highschool no modelo. Eu acho que seu modelo também está um pouco fora. Talvez faça isso:

{% extends 'base.html' %}

{% block content %}

<h2>{{ state }}</h2> #This works and shows the state based on the URL

<div class="row">
    <div class="col-12 col-sm-12 col-lg-12">
        <ul class="nav nav-tabs" id="myTab">
            <li class="active"><a href="#all">All</a></li>
            <li><a href="#high">High School</a></li>
        </ul>
    </div>


    <div id="content" class="tab-content">

        <div class="tab-pane active" id="all">
            <ul>
                {% for school in schools_by_state %}
                    <li>{{ school.school_name }}</li>
                {% endfor %}
            </ul>
        </div>

        <div class="tab-pane" id="high">
            <ul>
                {% for school in schools_highschool %}
                    <li>{{ school.school_name }}</li>
                {% endfor %}
            </ul>
        </div>  

    </div><!-- end content -->

</div><!-- end row -->

{% endblock content %}

Outras dicas

A resposta do JProffitts está correta, mas você também pode filtrar com base nesta consulta definida no seu modelo:

<div id="content" class="tab-content">
    <div class="tab-pane active" id="all">
    <ul>
        {% for school in schools_by_state %}
        <li>{{ school.school_name }}</li>
        {% endfor %}
    </ul>
    </div>
    <div class="tab-pane" id="high">
    <ul>
        {% for school in schools_by_state %}
         {% if school.grade == "9-12" %}
        <li>{{ school.school_name }}</li>
         {% endif %}
        {% endfor %}
    </ul>
    </div>  
</div><!-- end content -->
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top