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

时间:2018-10-04 16:09:06

标签: python django python-3.x django-models

我有三种型号:

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添加到链接中……但这并不能解决附加的主要问题一个模型字段到另一个模型的末尾,然后将它们同时“ URL化”。

1 个答案:

答案 0 :(得分:2)

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