Django: Как добавить искомое поле в ListView? - PullRequest
1 голос
/ 14 июля 2020

У меня есть модель (листинг ниже), которая содержит информацию о плавании корабля. Порты для плавания задаются дуплексом xxxx_country и xxxx_port.

Я перечисляю плавания с помощью класса ListingView на основе ListView. Я хочу передать в шаблон имя порта, а не xxxx_country и xxxx_port, и я могу получить имя из модели порта. Вот код:

# from listing/models.py

class Listing(models.Model):
    # Port Codes - see https://www.worldnetlogistics.com/seaport-codes/
    orig_country = models.CharField(max_length=2, blank=True)
    orig_port = models.CharField(max_length=3, blank=True)
    dest_country = models.CharField(max_length=2, blank=True)
    dest_port = models.CharField(max_length=3, blank=True)


# from codes/models.py

class Port(models.Model):
    country_code = models.CharField(max_length=2, blank=True)
    location_code = models.CharField(max_length=3, blank=True)
    name = models.TextField()


# from listing/views.py

class ListingView(ListView):
    model = Listing

    # need code here that looks up the port name by combination of country_code and location_code
    # one Port object will be returned
    orig_port_name = ?
    dest_port_name = ?

    template_name = 'listing/home.html'  # change from default template name
    ordering =['-ship_sailing']  # reordering the list in reverse order
    paginate_by = 16

Какой код мне нужно поместить в представление, чтобы я мог передать orrig_port_name и dest_port_name в шаблон?

С уважением ... Пол

1 Ответ

2 голосов
/ 14 июля 2020

Здесь вам нужен ForeignKey, который относится к Port объектам, вместо того, чтобы писать поля типа dest_country и dest_post в модели. Это приводит к дублированным данным . Дублированные данные являются антипаттерном, поскольку они затрудняют обслуживание, хранение, извлечение и агрегирование данных.

class Listing(models.Model):
    # Port Codes - see https://www.worldnetlogistics.com/seaport-codes/
    orig = models.<b>ForeignKey(
        'codes.Port'</b>,
        on_delete=models.PROTECT,
        related_name='listings_as_orig'
    <b>)</b>
    dest = models.<b>ForeignKey(
        'codes.Port'</b>,
        on_delete=models.PROTECT,
        related_name='listings_as_dest'
    <b>)</b>

Тогда вы можете получить

class ListingView(ListView):
    model = Listing
    queryset = Listing.objects.<b>select_related('orig', 'dest')</b>
    template_name = 'listing/home.html'
    paginate_by = 16

В шаблоне вы можете например, укажите его в таблице как:

<table>
  {% for object in object_list %}
    <tr>
        <td>{{ object<b>.orig.country_code</b> }}</td>
        <td>{{ object<b>.orig.location_code</b> }}</td>
        <td>{{ object<b>.orig.name</b> }}</td>
        <td>{{ object<b>.dest.country_code</b> }}</td>
        <td>{{ object<b>.dest.location_code</b> }}</td>
        <td>{{ object<b>.dest.name</b> }}</td>
    </tr>
  {% endfor %}
</table>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...