名、姓、電話番号、電子メール、住所などを含むテーブル リストにデータを保存する顧客フォームがあります。タイトルをクリックすると、そのフィールドを AZ または ZA から並べ替える並べ替え機能がリストにありました。問題は、別のモデルの外部キーである住所フィールドがあることです。アルファベット順にソートされず、それぞれの主キー (pk) を使用してソートされます。
Address モデルには Address、City、County、Postcode、および Country が含まれており、「Street Name、City、COUNTY、Country」という方法でテーブル リストに返されます。
Sort 関数は私の template.mako にあります:
<thead>
<tr>
<%
# a list of column field names and labels
column_fields = (
('first_name', 'First Name'),
('surname', 'Last Name'), ,
('phone__number', 'Phone'),
('email__email', 'Email'),
('address', 'Address'),
)
columns = ( {'field':x[0], 'label':x[1]} for x in column_fields )
%>
% for column in columns:
% if column['field'] == sort_field:
<th><a href="${self.util.reverse('customers')}?sort=- ${column['field']}">${column['label']}</th>
% else:
<th><a href="${self.util.reverse('customers')}?sort=${column['field']}">${column['label']}</th>
% endif
% endfor
</tr>
</thead>
Email と Phone も外部キーですが、それぞれのモデルから取得するフィールドは 1 つだけです (email_ email と phone _number)。
郡はドロップダウンであり、デフォルト値があるため、常に郡が選択されています。したがって、住所/市区町村フィールドが送信されない場合は、郡で並べ替えられるようにしたいと考えています。一方、住所/都市フィールドが入力されている場合は、それらで並べ替えたいと思います。
アドレスをソートする方法
私のviews.py:
def customers(request):
filtered = False
sort_field = request.GET.get('sort', 'first_name')
our_customers = Customer.objects.order_by(sort_field)
form = SearchForm(request.POST or None, request.FILES or None)
if request.method == 'POST' and \
form.is_valid() and \
form.cleaned_data['search'] and \
'clear-searchform' not in request.POST:
search = form.cleaned_data['search']
search_list = search.split()
duplicated_customers = []
for item in search_list:
the_customers = Customer.objects.filter(
Q(slug__icontains=item) |
Q(first_name__icontains=item) |
Q(surname__icontains=item) |
Q(dob__icontains=item) |
Q(phone__number__icontains=item) |
Q(email__email__icontains=item) |
Q(address__address__icontains=item) |
Q(address__city__icontains=item) |
Q(address__county__icontains=item) |
Q(address__postcode__icontains=item) |
Q(address__country__icontains=item) |
Q(medical__icontains=item) |
Q(notes__icontains=item)
# need to amend so can search by organization
)
duplicated_customers = chain(duplicated_customers, the_customers)
filtered = True
our_customers = set(duplicated_customers)
elif 'clear-searchform' in request.POST:
form = SearchForm()
dictionary = dict(
form=form,
customers=our_customers,
sort_field=sort_field,
filtered=filtered,
display_name=_('Customers'),
)
return dictionary
「Q()」はリストに設定された検索機能用です。