Django показывает неправильное значение записи после поиска

Вопрос:

У меня есть проблема с листингом данных с использованием django и django-tables2, которые я не могу понять.

Сценарий:

У меня есть представление, которое отображает список записей. В этом представлении также находится поле поиска для поиска определенной записи (“Домохозяйство”). Каждая отображаемая запись имеет поле (размер домохозяйства), которое является совокупным количеством других записей (Person) внутри него. т.е. HouseHold 1 состоит из 5 человек.

Проблема заключается в том, что при первоначальной загрузке страницы отображается правильный размер домашней записи. Например, используя пример, приведенный выше, он отобразит домашний размер 5 для HouseHold 1. См. Изображение ниже и отметьте размер домохозяйства первой записи.

Correct Household size

Но когда я вхожу в поисковый запрос для конкретной записи домохозяйства, возвращаемый результат всегда отображает квадрат домашнего размера, т.е. 25 в моем случае выше (5 * 5). См. Изображение ниже:

Incorrect Household size

Может кто-нибудь, пожалуйста, помогите мне выяснить, откуда эта ценность?

Ниже мой код:

urls.py

from apps.org.urls import office_url
from lib.security import secure_url as sec

... # Non-relevant code removed

sec(office_url('/household/list/$'),
registration_views.HouseholdList.as_view(),
name='household.list'),

views.household.py

from django.contrib import messages
from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from django.db import transaction
from django.db.models import Count
from django.utils.encoding import force_unicode
from django.utils.translation import ugettext_lazy as _
from django_tables2 import tables

from apps.registration.models import Household, Person
from lib.views import CoreListView

... # Non-relevant code left out for brevity and clarity

class HouseholdTable(tables.Table):
name = DetailUrlColumn()
location = tables.Column()
household_size = tables.Column(verbose_name=_("Household size"))
registration_date = tables.Column()
registration_user = tables.Column(verbose_name='Registered by')
document_id = DocumentListColumn(_('Document ID'), accessor='recipient_candidate', orderable=False)
action = ActionColumn(orderable=False,
actions=(
("delete", Household.get_delete_url, "btn-warning", "icon-remove-sign"),
("edit", Household.get_detail_url, "btn-info", "icon-edit"),
)
)

class Meta:
order_by = ("name")
empty_text = _("no household to display")


class HouseholdList(SelectedOfficeMixin, CoreListView):
template_name = 'registration/beneficiary/list.html'
model = Household
table_class = HouseholdTable
permissions = ['registration.view_household']
search_fields = ('name', 'members.documents.document_num')

def get_queryset(self):
"""Annotate so that the queryset can be ordered by household size."""
return self.selected_office.households.with_related_members().annotate(household_size=Count('members'))

def get_doc_url(self):
doc_root_url = super(HouseholdList, self).get_doc_url()
return urlparse.urljoin(doc_root_url, 'how_to_register_a_new_beneficiary_household.html')

lib.views.py

... # Non-relevant code left out

class CoreSearchMixin(object):
"""Subclasses must define search_fields = [field_1, ...field_n]
where the field is a string, the name of a field, and can contain the following prefix characters:

'^': the search field must start with the search term, case insensitive
'=': the search field must exactly equal the search term, case insensitive
'@': full-text search

If no prefix is given, any string that contains the search field will match.
"""
search_fields = None
search_form_class = SearchForm

@cachedproperty
def search_form(self):
return self.search_form_class(getattr(self.request, self.request.method))

def get_query_help_message(self):
"""Returns a comma separated list of fields that are used in the search, to help the user
create a search.
"""
fields = []
if self.search_fields:
for search_field in self.search_fields:
field = get_field_from_path(self.model, search_field)
fields.append(field.verbose_name.title())
return ",".join(fields)

def get_filtered_queryset(self, queryset):
if self.search_form.is_valid():
self.query = self.search_form.cleaned_data['q']
else:
self.query = None
if self.search_fields and self.query:
orm_lookups = (construct_search(str(search_field).replace('.', '__'))
for search_field in self.search_fields)
chained_or_queries = None
for bit in self.query.split():
or_queries = (models.Q(**{orm_lookup: bit})
for orm_lookup in orm_lookups)
if chained_or_queries:
chained_or_queries = itertools.chain(chained_or_queries, or_queries)
else:
chained_or_queries = or_queries
return queryset.filter(reduce(operator.or_, chained_or_queries))
else:
return queryset

def get_context_data(self, **kwargs):
return super(CoreSearchMixin, self).get_context_data(
search_form=self.search_form,
query_help_message=self.get_query_help_message(),
search_fields=self.search_fields,
**kwargs
)


class CoreListView(CoreSearchMixin, ListView):
"""Displays a simple searchable list.

Subclasses must define search fields as per CoreSearchMixin
"""
template_name = 'cv/generic/list.html'
table_class = None
paginate_by = 10

def get_table_class(self):
return self.table_class

def get_table(self, filtered_queryset):
return self.get_table_class()(filtered_queryset)

def get_context_data(self, **kwargs):
table = self.get_table(self.get_filtered_queryset(self.get_queryset()))
table.paginate(page=self.request.GET.get('page', 1), per_page=self.paginate_by)
RequestConfig(self.request, paginate=False).configure(table)
return super(CoreListView, self).get_context_data(table=table, **kwargs)

Что мне здесь не хватает?

Оцените статью
TechArks.Ru
Добавить комментарий