#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_by("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