Скрипт Django на Python

#python #django #django-templates #django-views #django-urls

#python #django #django-шаблоны #django-представления #django-urls

Вопрос:

Я просматривал документацию, но мне не кажется, что я получаю четкий ответ. Возможно ли запустить что-то похожее на python

 if company_name.startswith(('A')):
enter code here
  

из сайта или приложения Django? Как бы я это сделал?

В настоящее время код, который я использую, является

             {% for TblCompanies in object_list %}
              <tr class="customer-table">
                <td>{{ TblCompanies.company_id }}</td>
                <td>{{ TblCompanies.company_name }}</td>
                <td>{{ TblCompanies.contact_phone }}</td>
                <td>{{ TblCompanies.billing_address }}</td>
                <td>{{ TblCompanies.contact_e_mail }}</td>
              </tr>
            {% endfor %}
  

но наша клиентская база данных слишком велика, и это бремя, чтобы пройти по списку, чтобы найти клиента. Вместо этого я хочу отсортировать его в алфавитном порядке, используя URL-адреса, такие как http://path/to/customer_list/A

Комментарии:

1. Вы хотите иметь эту функцию в шаблоне? Почему бы вам не поместить его в представление?

2. Вы правы, у меня должно быть это в представлении. Я медленно перевожу свою структуру в объекты, ориентированные на просмотр, но я пока не настолько разбираюсь в программировании на Python 🙂

3. Шаблоны Django имеют очень ограниченные возможности. Я думаю, у вас нет возможности добавлять в него функции.

Ответ №1:

Используя slice filter, вы можете получить подстроку; затем сравните подстроку с 'A' :

 {% for TblCompanies in object_list %}
  {% if TblCompanies.company_name|slice:':1' == 'A' %}
  <tr class="customer-table">
    <td>{{ TblCompanies.company_id }}</td>
    <td>{{ TblCompanies.company_name }}</td>
    <td>{{ TblCompanies.contact_phone }}</td>
    <td>{{ TblCompanies.billing_address }}</td>
    <td>{{ TblCompanies.contact_e_mail }}</td>
  </tr>
  {% endif %}
{% endfor %}
  

Как прокомментировал @Matthias, было бы лучше передать filtered object_list в представлении. Предполагается object_list , что это объект набора запросов:

 object_list = object_list.filter(company_name__startswith='A')
  

Sorintg

Отсортируйте object_list его перед передачей в шаблон:

 page = requests.REQUEST.get('page', 'A')  # or Get from view parameter
                                          #    depending on url conf.
object_list = (object_list.filter(company_name__startswith=page)
                          .order_by('company_name'))
  

Обновить

ПРИМЕЧАНИЕ: изменение app с фактическим именем приложения.

urls.py:

 url(r'^/path/to/site/customers/(?P<page>[A-Z])$', 'app.views.list_customers')
  

app/views.py:

 from django.shortcuts import render

def list_compnaies(request, page):
    object_list = (Customer.objects.filter(company_name__startswith=page)
                           .order_by('company_name'))
    return render(request, 'customers/list.html', {
        'object_list': object_list,
    })
  

customers/list.html

 {# Link to A .. Z customer pages %}
{% for page in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' %}
<a href="/path/to/site/customers/{{ page }}">{{ page }}</a>
{# Use {% url ... %} once you learn the url tag if possible to reduce duplicated hard-coded url #}
{% endif %}

{% for TblCompanies in object_list %}
<tr class="customer-table">
    <td>{{ TblCompanies.company_id }}</td>
    <td>{{ TblCompanies.company_name }}</td>
    <td>{{ TblCompanies.contact_phone }}</td>
    <td>{{ TblCompanies.billing_address }}</td>
    <td>{{ TblCompanies.contact_e_mail }}</td>
</tr>
{% endfor %}
  

Комментарии:

1. @Addohm, я не понимаю? Разве вы не хотели if функциональности в шаблоне?

2. @Addohm, используя .order_b‌​y("company_name") , вы получите его в алфавитном порядке.

3. @Addohm, как насчет получения параметра типа ?page=A (или захвата страницы в URL: ^page/(P<page>d )/?$ ) и фильтрации object_list в представлении, как показано в ответе?

4. @Addohm, я обновил ответ, чтобы показать пример. Я собираюсь спать. Если у вас есть еще вопросы, добавьте комментарий. Я отвечу через 9 ~ 10 часов.

5. Кроме того, если все, что вы хотите, это отобразить список из множества записей N записей одновременно, вы можете обратиться к встроенной поддержке разбивки на страницы Django docs.djangoproject.com/en/1.8/topics/pagination