Получение первых трех человекочитаемых элементов в наборе запросов
Я пытаюсь отобразить элементы в представлении Django. Каждый объект клиники имеет множество особенностей, но из эстетических соображений я хочу, чтобы в шаблоне отображались только первые три из них. Я пробовал:
def clinics_index(request):
clinics = Clinic.objects.all()
for clinic in clinics:
speciality = clinic.get_speciality_display
context = {
'clinics' : clinics,
'speciality' : speciality.first,
}
return render(request, 'guide/clinic/clinic_directory.html', context)
Теперь это отображает человекочитаемое название поля специальности (которое является полем множественного выбора в модели). Однако я не могу использовать вычитание, чтобы получить только 3 элемента, как здесь:
speciality = clinic.get_speciality_display[:3]
После этого я получаю следующую ошибку:
TypeError at /guide/clinics/
'method' object is not subscriptable
Как я могу его визуализировать?
Редактирование:
Это модель клиники:
class Clinic(models.Model):
name = models.CharField(max_length=75, blank=True, null=True)
speciality = MultiSelectField(choices=Speciality.choices, max_length=100, blank=True, null=True)
city = models.CharField(max_length=20, choices=Cities.choices, blank=True, null=True)
ward = models.CharField(max_length=20, choices=Wards.choices, blank=True, null=True)
full_address = models.CharField(max_length=100, blank=True, null=True)
maps_link = models.CharField(max_length=75, blank=True, null=True)
train_access = models.CharField(max_length=50, blank=True, null=True)
bus_access = models.CharField(max_length=50, blank=True, null=True)
parking = models.CharField(_('Parking availability'), max_length=75, blank=True, null=True)
phone_number = models.CharField(max_length=20, blank=True, null=True)
english_support = models.BooleanField(default=False, blank=True, null=True)
holiday_availability = models.BooleanField(_('Availability on weekends/holidays'), default=False, blank=True, null=True)
slug = models.SlugField(blank=True, null=True)
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('guide:clinic_detail', kwargs={"slug" : self.slug})
И фрагмент шаблона:
<tbody>
{% for clinic in clinics %}
<tr>
<td>{{clinic.name}}</td>
<td>{{clinic.city}}</td>
<td>{{clinic.ward}}</td>
<td>{{speciality}}</td>
<td><a href="{{clinic.get_absolute_url}}">More...</a></td>
</tr>
{% endfor %}
</tb
ody>
Предполагаю, что в цикле вы хотите собрать все данные. Для этого нужно сохранить их в список. Но это излишество, просто передайте clinics
в словарь и выполните итерацию по всем значениям в шаблоне. Также для ссылок я использовал clinic.slug
вместо clinic.get_absolute_url
, поскольку модель уже возвращает сгенерированный url через метод get_absolute_url
.
views.py
def clinics_index(request):
clinics = Clinic.objects.all()[:3]
return render(request, 'guide/clinic/clinic_directory.html', {'context': clinics})
templates
{% for clinic in context %}
<p>{{ clinic }}</p>
<tr>
<td>{{ clinic.name }}</td>
<td>{{ clinic.city }}</td>
<td>{{ clinic.ward }}</td>
<td>{{ clinic.speciality }}</td>
<td><a href="{{ clinic.slug }}">More...</a></td>
</tr>
{% endfor %}
</tbody>