Django 用于视图中的循环
在视图中,我希望获得car对象,然后更改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
第一年
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
功能放在具有日期的任何型号上。如果是第一年的车型
则将函数放在那里,并相应地调整我的答案。或者发布您的模型。我更新了我的帖子,以反映将模型功能放在第一年的模型上。我还更改了模板代码以反映连接。