代码之家  ›  专栏  ›  技术社区  ›  OverflowingTheGlass

Django将模型字段作为参数传递给存储在另一个模型中的URL

  •  1
  • OverflowingTheGlass  · 技术社区  · 6 年前

    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
    

    …或者如果有多个 实体 为了一个 item :

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

    中的每个报告 Report

    报告 标记是否 应该添加到链接中…但这并不能解决将一个模型字段附加到另一个模型字段的末尾并将它们“urlizing”在一起的主要问题。

    1 回复  |  直到 6 年前
        1
  •  2
  •   grrrrrr    6 年前

    来一杯怎么样 model method 创建链接?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