0

名、姓、電話番号、電子メール、住所などを含むテーブル リストにデータを保存する顧客フォームがあります。タイトルをクリックすると、そのフィールドを 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()」はリストに設定された検索機能用です。

4

1 に答える 1

0

ForeignKey モデル (county など) のフィールドで並べ替えるには、外部モデルとフィールド名を「__」(2 つのアンダースコア) で区切って使用します。

customers = Customer.objects.all().order_by('address__county')

https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by

並べ替えフィールドを条件付きで設定するには:

if address.city != '':
    sort_field = 'address__city'
else:
    sort_field = 'address__county'
customers = Customer.objects.all().order_by(sort_field)
于 2013-09-12T10:54:32.830 に答える