Включать аргументы query в пагинацию Джанго

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

Например:

http://127.0.0.1:8000/buscar/?parque=ejemplo&fallo=&intervencion=&fecha_inicial=2015-12-01&fecha_final=2016-01-31

Серьезная страница 2:

http://127.0.0.1:8000/buscar/?pagina=2=parque=ejemplo&fallo=&intervencion=&fecha_inicial=2015-12-01&fecha_final=2016-01-31

Но это остается так:

http://127.0.0.1:8000/buscar/?pagina2

Уже меня не включают поиски. Я дал ему тысячу возвращений теме и это не получаю.

Это вид:

@login_required
def buscar(request):
    errors = []
    if request.method == 'GET':
        if not request.GET.get('fecha_inicial', '') or not request.GET.get('fecha_final', ''):
            errors.append('por favor introduce fecha inicio y fecha fin ambas son requeridas.')
        else:
            parque = request.GET.get('parque', '')
            tipo = request.GET.get('tipo', '')
            maquina = request.GET.get('maquina', '')
            fallo = request.GET.get('fallo', '')
            intervencion = request.GET.get('intervencion', '')
            fecha_inicial = request.GET.get('fecha_inicial', '')
            fecha_final = request.GET.get('fecha_final', '')
            q1 = incidencias.objects.filter(Parque__icontains=parque)
            q2 = q1.filter(Tipo__icontains=tipo)
            q3 = q2.filter(Maquina__icontains=maquina)
            q4 = q3.filter(Fallo__icontains=fallo)
            q5 = q4.filter(Intervencion__icontains=intervencion)
            q = q5.filter(Fecha__range=(fecha_inicial, fecha_final))
            queryset_list = q
            paginator = Paginator(queryset_list, 5)

            page = request.GET.get('pagina')
            try:
                queryset = paginator.page(page)
            except PageNotAnInteger:

                queryset = paginator.page(1)
            except EmptyPage:

                queryset = paginator.page(paginator.num_pages)

            context = {
                "objetc_list": queryset,
                "parte": "Lista",
            }
            return render(request, 'partes.html', context)
        return render(request, 'formulario.html',
        {'errors': errors})

Сдержись:

{% extends 'base.html' %}

{% block content %}


    {% if objetc_list %}
    <p>Partes encontrados: {{ objetc_list|length }} parte{{ objetc_list|pluralize }}.</p>
        <table class="responsive-table striped sombra">
            <thead>
                <tr>
                    <th>Parque</th>
                    <th>Tipo</th>
                    <th>Maquina</th>
                    <th>Fecha</th>
                    <th>Fallo</th>
                    <th>Intervencion</th>
                    <th>OT</th>
                </tr>
            </thead>
            <tbody>
                 {% for obj in objetc_list %}
                <tr>
                    <td>{{ obj.Parque|capfirst }}</td>
                    <td>{{ obj.Tipo|capfirst }}</td>
                    <td>{{ obj.Maquina|capfirst }}</td>
                    <td>{{ obj.Fecha|date:"d/m/Y" }}</td>
                    <td>{{ obj.Fallo }}</td>
                    <td>{{ obj.Intervencion }}</td>
                    <td><a href="{% url 'miapp.views.detalleParte' pk=obj.pk %}">{{ obj.OT }}</a></td>
                </tr>
                   {% endfor %}
            </tbody>
        </table>


  <ul class="pagination">
    {% if objetc_list.has_previous %}
    <li class="waves-effect"><a href="?pagina={{ objetc_list.previous_page_number }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}"><i class="material-icons">chevron_left</i></a></li>
    {% endif %}

        <span class="current">Pagina {{ objetc_list.number }} de {{ objetc_list.paginator.num_pages }}</span>

    {% if objetc_list.has_next %}
    <li class="waves-effect"><a href="?pagina={{ objetc_list.next_page_number }}{% if request.GET.q %}&q={{ request.GET.q }}{% endif %}"><i class="material-icons">chevron_right</i></a></li>
    {% endif %}
  </ul>


{% else %}
    <p class="text-center"><strong> No hay partes para su busqueda. </strong></p>
{% endif %}



{% endblock content %}

Модель:

class incidencias(models.Model): 

       Parque = models.CharField(max_length=15, choices=LISTA_PARQUES, default='ejemplo')
       Tipo = models.CharField(max_length=20, choices=TIPO_INTERVENCION)
       Maquina = models.CharField(max_length=6, choices=LISTA_MAQUINAS)
       Fecha = models.DateField()
       Fallo = models.CharField(max_length=3)
       Sintoma = models.TextField(blank=True)
       Intervencion = models.TextField()
       Observaciones = models.TextField(blank=True)
       Tec1 = models.CharField(max_length=3, choices=LISTA_TECNICOS)
       Tec2 = models.CharField(max_length=3, choices=LISTA_TECNICOS)
       Tec3 = models.CharField(max_length=3, choices=LISTA_TECNICOS, blank=True)
       Tec4 = models.CharField(max_length=3, choices=LISTA_TECNICOS, blank=True)
       OT = models.CharField(max_length=15)

       class Meta:
          verbose_name = 'incidencia'
          order_with_respect_to = 'Maquina'



       def __unicode__(self):
          return '%s - %s - %s - %s' % (self.Tipo, self.Maquina, self.Fallo, self.OT)

    class incidenciasAdmin(admin.ModelAdmin):
       list_display = ('Tipo', 'Maquina', 'Fallo', 'Fecha', 'OT')
3
задан 14.01.2016, 16:52
4 ответа

Ты мог бы перемещать вручную параметры унифицированного указателя ресурса в тебя сдержись препятствуя параметру pagina (как предложенное в этом Snippet), в твоем случае оно было бы чем-либо подобным:

@login_required
def buscar(request):
    ...
    parametros = request.GET.copy() # Es una copia del GET
    if parametros.has_key('pagina'):
        del parametros['pagina']
    ...
    context['parametros'] = parametros
    ...

И в тебе сдержись:

<ul class="pagination">
    {% if objetc_list.has_previous %}
        <li class="waves-effect"><a href="?pagina={{ objetc_list.previous_page_number }}&{{parametros.urlencode}}"><i class="material-icons">chevron_left</i></a></li>
    {% endif %}

        <span class="current">Pagina {{ objetc_list.number }} de {{ objetc_list.paginator.num_pages }}</span>

    {% if objetc_list.has_next %}
    <li class="waves-effect"><a href="?pagina={{ objetc_list.next_page_number }}&{{parametros.urlencode}}"><i class="material-icons">chevron_right</i></a></li>
    {% endif %}
</ul>

В сдержись, я использую функцию QueryDict.urlencode GET чтобы перемещать Ваши параметры в формат, принятый унифицированным указателем ресурса:

>>> request.GET
<QueryDict: {'a': ['1'], 'c': ['3'], 'b': ['2']}>
>>> request.GET.urlencode()
'a=1&c=3&b=2'

Это finalemente помогает тебе получать то, что ты хочешь:

?pagina=10&a=1&c=3&b=2

Другой выбор, который в меня я функционирует очень хорошо, состоит в том, чтобы использовать django-datatables-view чтобы манипулировать обработкой в стороне сервера используя DataTables, ты забываешь бороться с пагинацией, поисками и распоряжением в пользу колонн. Ты можешь добиваться чего-то как это:

introducir la descripción de la imagen aquí

1
ответ дан 24.11.2019, 14:59
  • 1
    Спасибо! правда состоит в том, что тема пагинации немного приводящая в отчаяние. Не знал DataTables, в моем приложении я показываю практически все в подмостках я быть и # 225; большой утилиты. – Eibi76 14.01.2016, 17:15
  • 2
    @Eibi76 ничего! Не забывай пометить ответ, который ты считаешь, это правильная для того, чтобы твой вопрос не остался в воздухе – César 14.01.2016, 17:17

Я рекомендую тебя django-haystack для твоих поисков, это pontente пакет, который выносит различные услуги поисков, так как он обладает Вашими соответствующими backends.

Он облегчит тебе жизнь.

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

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

Я сожалею о том, что не больше утилиты, но надеюсь, что он подает тебе мою рекомендацию.

1
ответ дан 24.11.2019, 14:59
  • 1
    Большое спасибо, я загрузился haystack, он мне кажется очень интересным выбором. Пытаться и # 233; чтобы это осуществлять. – Eibi76 14.01.2016, 17:12
  • 2
    Не забывай твой обет: D – SalahAdDin 13.03.2016, 23:17

Благодаря помощи комментария Сесара Бустиос я смог давать быстрое и простое решение обременительной темы пагинации, прежде всего, если ты начинающий с Пайтоном и Джанго, как это мой случай.

Вид:

def buscar(request):
errors = []
if request.method == 'GET':
    if not request.GET.get('fecha_inicial', '') or not request.GET.get('fecha_final', ''):
        errors.append('Por favor introduce fecha inicio y fecha fin ambas son requeridas.')
    else:
        parque = request.GET.get('parque', '')
        tipo = request.GET.get('tipo', '')
        maquina = request.GET.get('maquina', '')
        fallo = request.GET.get('fallo', '')
        intervencion = request.GET.get('intervencion', '')
        fecha_inicial = request.GET.get('fecha_inicial', '')
        fecha_final = request.GET.get('fecha_final', '')
        q1 = incidencias.objects.filter(Parque__icontains=parque)
        q2 = q1.filter(Tipo__icontains=tipo)
        q3 = q2.filter(Maquina__icontains=maquina)
        q4 = q3.filter(Fallo__icontains=fallo)
        q5 = q4.filter(Intervencion__icontains=intervencion)
        queryset_list = q5.filter(Fecha__range=(fecha_inicial, fecha_final))

        paginator = Paginator(queryset_list, 4)

        parametros = request.GET.copy() 
        if parametros.has_key('pagina'):
            del parametros['pagina']

        page = request.GET.get('pagina')
        try:
            queryset = paginator.page(page)
        except PageNotAnInteger:

            queryset = paginator.page(1)
        except EmptyPage:

            queryset = paginator.page(paginator.num_pages)

        context = {
            "objetc_list": queryset,
            "parametros": parametros,
        }
        return render(request, 'partes.html', context)
    return render(request, 'formulario.html',
    {'errors': errors})

И пагинация template:

<ul class="pagination">
{% if objetc_list.has_previous %}
<li class="waves-effect"><a href="?pagina={{ objetc_list.previous_page_number }}{% if parametros.urlencode %}&{{ parametros.urlencode }}{% endif %}"><i class="material-icons">chevron_left</i></a></li>
{% endif %}

    <span class="current">Pagina {{ objetc_list.number }} de {{ objetc_list.paginator.num_pages }}</span>

{% if objetc_list.has_next %}
<li class="waves-effect"><a href="?pagina={{ objetc_list.next_page_number }}{% if parametros.urlencode %}&{{ parametros.urlencode }}{% endif %}"><i class="material-icons">chevron_right</i></a></li>
{% endif %}

1
ответ дан 24.11.2019, 14:59
  • 1
    Поздравления! Как хорошо, что оно ты функционировало – César 16.01.2016, 18:05
  • 2
    Está превосходный, но querí, то есть, если возможно делать это без необходимости вновь загружать все данные снова, а именно имея по отношению к руке уже сделанную консультацию, в моем случае данные будучи нужно консультировать которых - очень большие. – inkarri 18.03.2017, 01:15

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

def paginar(request):
    p=Producto.objects.all()
    paginator=Paginator(p,12)
    try:
        pagina=int(request.GET.get("page","1"))
    except ValueError:
        pagina=1
    try:
        p=paginator.page(pagina)
    except(InvalidPage, EmptyPage):
        p=paginator.page(paginator.num_pages)
    return p


В конце концов, когда ты пошлешь данные haslo используя следующее:

def pagina_index(request):
   return render_to_response("mihtml.html", {"items":paginar(request)})
0
ответ дан 24.11.2019, 14:59