Получение первых трех человекочитаемых элементов в наборе запросов

Я пытаюсь отобразить элементы в представлении 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>
Вернуться на верх