Поле модели Django Pass в качестве параметра для URL-адреса, хранящегося в другой модели - PullRequest
0 голосов
/ 04 октября 2018

У меня есть три модели:

class Entity(models.Model):
    entity = models.CharField(primary_key=True, max_length=25)

class Report(models.Model):
    report = models.CharField(max_length=50)
    report_link = models.CharField(max_length=300)

class Item(models.Model):
    entities = models.ManyToManyField(Entity, related_name='entities')
    report = models.ForeginKey(Report)

Представление построено на модели Item:

def item_list(request):
    items = Item.objects.select_related('report').prefetch_related('entities')
    return render(request, 'items/item_list.html', {'items':items})

Это представление направляется в шаблон:

{% for item in items %}
  <tr>
    <td>
        {% for entity in item.entities.all %}
          {{ entity }}{% if not forloop.last %}, {% endif %}
        {% endfor %}
    </td>
    <td>{{ item.report }}</td>
    <td>{{ item.report.report_link|urlize }}</td>
  </tr>
{% endfor %}

Эта строка (<td>{{ item.report.report_link|urlize }}</td>) проявляется в браузере следующим образом:

https://server.domain/reports/specificReport?entity=

Как бы передать entities в URL-адрес для фильтрации отчета?Желаемый результат будет выглядеть следующим образом:

https://server.domain/reports/specificReport?entity=12345

... или если есть несколько entities для одного item:

https://server.domain/reports/specificReport?entity=12345,56789

Каждый отчет в ReportМодель имеет ссылку, но ссылка не обязательно принимает параметр объекта, поэтому было бы не идеальным глобально изменять все ссылки (например, через jQuery или какой-либо другой JS).Тем не менее, на этой странице работает JS, так что возможно использовать это ... хотя я думаю, что вариант Django может быть лучшим.

Одна вещь, о которой я подумал, - это добавить в модель Report индикатор, который помечает, нужно ли добавить entities к ссылке ... но это не решает основную проблему прикреплениясмоделируйте поле до конца другого и «урлируйте» их обоих вместе.

1 Ответ

0 голосов
/ 04 октября 2018

Как насчет метода модели для создания ссылки?В документации Django упоминается следующее об использовании методов модели, которые применимы к вашему варианту использования

Это ценный метод для хранения бизнес-логики в одном месте - модели.

Это означает, что вам не нужно копать ваши шаблоны и теги шаблонов, чтобы увидеть, как генерируется ссылка на отчет элемента - вы можете увидеть все это в models.py

.для начала

class Item(models.Model):
    entities = models.ManyToManyField(Entity, related_name='entities')
    report = models.ForeginKey(Report)

    def get_report_link(self):
        link_text = self.report.report_link
        if self.entities.count() > 0:
            link_text + "?entity={}".format(','.join([entity.id for entity in self.entities.all()]))
        return link_text

и затем в вашем шаблоне: измените item.report.report_link|urlize на item.get_report_link

...