Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模板访问不在循环中的多对多数据_Django_Templates - Fatal编程技术网

Django模板访问不在循环中的多对多数据

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字段,而不需要第二个for循环。 我已经搜索了文档和google,但我能找到的所有答案都显示了如何通过fishnumber.fish.all循环访问字段。
这很好,但我想在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'))