Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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 - Fatal编程技术网

Django 用于视图中的循环

Django 用于视图中的循环,django,Django,在视图中,我希望获得car对象,然后更改第一年var def cars(request, mark_id, year=year): #BMW, etc. mark = get_object_or_404(Mark, pk=mark_id, active=1) #M, X-series, etc. for group in mark.groups.iterator(): group.first_year.year = int(year

在视图中,我希望获得car对象,然后更改
第一年
var

def cars(request, mark_id, year=year):
        #BMW, etc.
    mark = get_object_or_404(Mark, pk=mark_id, active=1)
        #M, X-series, etc.
    for group in mark.groups.iterator():
        group.first_year.year = int(year)-int(group.first_year.year)
    return render(request, 'cars.html', {  'mark':mark, })
因此,在模板中,我使用:

{% for i in mark.groups.all %}

{{i.first_year}}

{% endfor %}
它从db返回值,而不是我的
组.first_year.year
。正如您所了解的,共有3种型号-mark、groups和first_year。如果你需要的话,我可以在这里发表,但我认为,我的观点有问题

谢谢

编辑。型号。

class First_Year(models.Model):
    year = models.IntegerField()
    def __unicode__(self):
        return str(self.year)

class Groups(models.Model):
        many_other_fields
    mark = models.ForeignKey(Mark, related_name='groups')
    last_update = models.DateTimeField()
    first_year = models.ForeignKey(First_Year, related_name='first_year')
    def __unicode__(self):
        return self.name
    def altered_date(self, year):
        altered_year = int(year)-int(self.first_year.year)
        return altered_year
没有型号标记,因为它有许多字段没有年份等。

您的意思是:

{% for i in mark.groups_set.all %}
   {{i.first_year}}
{% endfor %}
仅当组具有来自mark的外键时,才允许此操作。您的意思是:

{% for i in mark.groups_set.all %}
   {{i.first_year}}
{% endfor %}

仅当组具有来自标记的外键时,这才允许在视图中进行更改的循环的
不会将更改保存在任何位置,因此在将值传递到模板时,您将看不到更改

这里的一个解决方案是向模型中添加一个新的模型方法,并在那里进行日期比较

在您的
第一年
车型中添加
更改日期
功能,如下所示:

class First_Year(models.Model):
    year = models.IntegerField()
    def __unicode__(self):
        return str(self.year)
    def altered_date(self, this_year):
        altered_year = int(this_year)-int(self.year)
        return altered_year
def cars(request, mark_id, year=year):
    ...
    return render(request, 'cars.html', {'mark':mark, 'year':year, })
通过调用函数,可以为每个
第一年
模型获取更改的年份。不幸的是,此函数需要一个附加参数-
year
,因此无法直接从模板调用它。您可以创建自定义模板过滤器来解决此问题:

@register.filter
def get_altered_year(obj, gar):
    return obj.altered_date(gar)
现在,您只需通过如下方式修改您的报税表,确保您在视图中度过了一年:

class First_Year(models.Model):
    year = models.IntegerField()
    def __unicode__(self):
        return str(self.year)
    def altered_date(self, this_year):
        altered_year = int(this_year)-int(self.year)
        return altered_year
def cars(request, mark_id, year=year):
    ...
    return render(request, 'cars.html', {'mark':mark, 'year':year, })
然后在模板中,您可以执行以下操作:

{% for i in mark.groups_set.all %}
    {{i.first_year|get_altered_year:year }}
{% endfor %}

您可以查看模型方法文档。以及自定义模板过滤器的文档。

视图中进行更改的
循环不会将更改保存在任何位置,因此在将值传递到模板时,您将看不到更改

这里的一个解决方案是向模型中添加一个新的模型方法,并在那里进行日期比较

在您的
第一年
车型中添加
更改日期
功能,如下所示:

class First_Year(models.Model):
    year = models.IntegerField()
    def __unicode__(self):
        return str(self.year)
    def altered_date(self, this_year):
        altered_year = int(this_year)-int(self.year)
        return altered_year
def cars(request, mark_id, year=year):
    ...
    return render(request, 'cars.html', {'mark':mark, 'year':year, })
通过调用函数,可以为每个
第一年
模型获取更改的年份。不幸的是,此函数需要一个附加参数-
year
,因此无法直接从模板调用它。您可以创建自定义模板过滤器来解决此问题:

@register.filter
def get_altered_year(obj, gar):
    return obj.altered_date(gar)
现在,您只需通过如下方式修改您的报税表,确保您在视图中度过了一年:

class First_Year(models.Model):
    year = models.IntegerField()
    def __unicode__(self):
        return str(self.year)
    def altered_date(self, this_year):
        altered_year = int(this_year)-int(self.year)
        return altered_year
def cars(request, mark_id, year=year):
    ...
    return render(request, 'cars.html', {'mark':mark, 'year':year, })
然后在模板中,您可以执行以下操作:

{% for i in mark.groups_set.all %}
    {{i.first_year|get_altered_year:year }}
{% endfor %}

您可以查看模型方法文档。以及自定义模板过滤器的文档。

是的,组-它是一个相关的名称。代码从db返回值,而不是从viewsyes、groups返回值——这是一个相关的名称。代码从数据库返回值,而不是从视图返回值,但它不能正确工作:
int()参数必须是字符串或数字,而不是“第一年”
,因为我有第一年的模型,所以我尝试
更改的年=int(Year)-int(self.First\u Year.Year)
,它返回
“long”对象没有属性“alterned\u date”
我的答案是根据您的群组模型中的年份字段定制的。您应该将
changed\u year
功能放在具有
日期的任何型号上。如果是第一年的
车型
则将函数放在那里,并相应地调整我的答案。或者发布您的模型。我更新了我的帖子,以反映将模型功能放在第一年的
模型上。我还更改了模板代码以反映联接。但它不正确:
int()参数必须是字符串或数字,而不是“First\u Year”
,因为我有First\u Year-model,我尝试
changed\u Year=int(Year)-int(self.First\u Year.Year)
,它返回
“long”对象没有属性“alterned\u date”
我的答案是根据您的群组模型中的年份字段定制的。您应该将
changed\u year
功能放在具有
日期的任何型号上。如果是第一年的
车型
则将函数放在那里,并相应地调整我的答案。或者发布您的模型。我更新了我的帖子,以反映将模型功能放在第一年的
模型上。我还更改了模板代码以反映连接。