Django模板访问不在循环中的多对多数据
我想通过与Fish的多对多关系信息访问sci_name字段,而不需要第二个for循环。 我已经搜索了文档和google,但我能找到的所有答案都显示了如何通过fishnumber.fish.all循环访问字段。Django模板访问不在循环中的多对多数据,django,templates,Django,Templates,我想通过与Fish的多对多关系信息访问sci_name字段,而不需要第二个for循环。 我已经搜索了文档和google,但我能找到的所有答案都显示了如何通过fishnumber.fish.all循环访问字段。 这很好,但我想在Fish表中指定确切的行,并从sci_name列中选择元素,而不必在Info和Fish之间的多对多关系中的所有行中循环。如果要获得单个第n个元素,请执行以下操作: models.py class Fish(models.Model): sci_name = mode
这很好,但我想在Fish表中指定确切的行,并从sci_name列中选择元素,而不必在Info和Fish之间的多对多关系中的所有行中循环。如果要获得单个第n个元素,请执行以下操作:
models.py
class Fish(models.Model):
sci_name = models.CharField(max_length=50)
com_name = models.CharField(max_length=50)
...
class Info(models.Model):
fish = models.ManyToManyField(Fish)
short_description = models.TextField(max_length=200)
...
views.py
def available(request):
in_stock = Info.objects.order_by('id')
...
context = RequestContext(request, {
'in_stock': in_stock,
...
available.html
{% for fishnumber in in_stock %}
{{ fishnumber.short_description }} //this line works
{{ fishnumber.fish.sci_name }} //this line doesn't work
{% for fish in fishnumber.fish.all %} //this loop works
{{ fish.sci_name }}
{% endfor %}
此处捕获异常-索引可能不存在,即使是0。
如果要通过其他条件获取,请在查询中指定条件并获取所需的第X项(可能是第一项)
请记住,M2M是管理器,它们执行查询,而不是数组
再次记住:可以在括号之间指定[anyIndex],甚至可以指定[any:slice]。两者都将被视为限制偏移量,具有适当数字映射的金额,例如[1:6]将变为限制1,5,即6-1。不支持负索引
实际上,我不知道你需要什么标准:
如果需要特定条件,请在此处预处理query=infoInstance.fish.FilterCriteria
否则,preprocessquery=infoInstance.fish.all
之后,您可以:
如果您希望只有一个具有该条件的对象存在,并且为0或2+对象是错误的,则do object=query.get而不是filter
如果在特定位置需要特定对象,请保留筛选器或全部,并按如下方式索引:object=query[positionYouWant]
你需要有办法决定你想要哪一个。我的意思是——假设有三条鱼,你如何区分你想要的那条鱼?每一个都有自己的sci_名称。要选择其中一个,您需要提供该功能 或者,换句话说,只需使用模型方法。假设你想捕捉最新的鱼,并给出它的sci_名称。你会这么做的
all_qs = (a specific Info instance).fish.all() #i suggest using an order criteria here
myobject = all_qs[0] #get the first object returned by the query
myval = myobject.sci_name
然后在模板中:
class Info(models.Model):
...
def latest_catch(self):
return self.fish.latest().sci_name
或者,您可能希望所有相关的sci_名称都用逗号连接:
{% for fishnumber in in_stock %}
{{ fishnumber.short_description }}
{{ fishnumber.latest_catch }}
{% endfor %}
*我不记得.值是如何运行的,也许直接连接不起作用。不管怎样,你明白了,对吧
如果您需要向该函数传递一些参数,比如说一个id来过滤鱼,那么您不能在模板中执行此操作,除非有或没有什么大不了的不循环是什么意思?你认为最终结果会是什么样子?我只想直接用fishnumber.fish.sci_name之类的东西访问sci_name字段,但我缺少一些语法。我不知道如何指定要访问的多对多关系中的特定一个,所以现在我只能通过循环一个接一个地访问它们。我想在页面上显示单个sci_name元素。现在我只能看到三个sci_名称元素一个接一个地显示出来。你没有遗漏任何语法,你只是对你要做的事情非常不清楚。有什么问题吗?你希望它表现如何?对于你试图达到的最终结果,等等。对不起,我想说的是具体的,我只是不知道该用什么词。我想在页面上显示一个sci_name元素。现在,我只能在一行中显示所有三个sci_名称元素。我正在尝试从模板中访问该元素。我知道如何在普通python代码中实现这一点,但我无法让它在模板中工作。我是否需要向模板发送比“库存”更多的信息:库存,是的,因为您无法从模板中索引/传递参数。您必须对其进行预处理并将结果传递给模板。或您应该注册自己的标记或过滤器来完成此操作。感谢您的输入,您对向模板发送什么/如何发送有什么建议吗?当我使用for循环时,我可以访问所有元素,但如果我只想访问特定的元素,则不能访问。因为要访问特定的元素,您实际上应该检索它。鱼不是一个例子,而是一个管理者。管理器允许您执行查询。使用所需的条件运行查询,然后通过索引在特定位置获取对象。警告:此处可能出现异常。抓住他们。
class Info(models.Model):
...
def fish_names(self):
return ', '.join(self.fish.values('sci_name'))