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

Python Django将模型字段作为参数传递给存储在另一个模型中的URL,python,django,python-3.x,django-models,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):

我有三种型号:

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)
视图是基于
项构建的
模型:

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 %}
如何将
实体
传递到URL以过滤报告?预期结果如下所示:

https://server.domain/reports/specificReport?entity=12345
…或者如果一个
项目有多个
实体

https://server.domain/reports/specificReport?entity=12345,56789
报告
模型中的每个报告都有一个链接,但链接不一定采用实体参数,因此全局更改所有链接(即通过jQuery或其他JS)并不理想。然而,这个页面上运行的是JS,所以可以使用它……尽管我认为Django选项可能是最好的

我考虑过的一件事是在
报告
模型中添加一个指示器,用于标记是否应将
实体
添加到链接中……但这并不能解决将一个模型字段附加到另一个模型字段的末尾并将它们“URL化”在一起的主要问题。

创建链接的方法如何?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\u link | urlize
item.get\u report\u link

我喜欢这样-谢谢!如果一个项目有一个实体,但报表链接不接受参数?这是否只是一个if/else语句…就像伪代码
如果self.report.report\u链接以“=”…else…“
?我得到了一个
“ManyRelatedManager”对象不可编辑的
错误,指向模板行是的,这是未测试的代码,您需要self.entities.all()我相信这太棒了-我一直害怕因为某些原因而深入研究模型方法…这是一个很好的推动,以确保我在这样的情况下研究它们。非常感谢。你会很高兴你这么做的,尤其是随着你的项目的发展!
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