2013-02-28 139 views
1

在視圖中,我想獲取汽車對象,然後更改first_year var。For loop in views

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 %} 

它從數據庫返回的值,而不是我的group.first_year.year。正如你所能理解的那樣,有三種模式 - 標記,組和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 

沒有模型馬克,bacause它有沒有一年多了,許多領域等

回答

1

for循環在您的視圖中進行更改不會保存任何位置的更改,因此當值傳遞給您時不會看到更改r模板。

這裏的一個解決方案是在模型中添加一個新的模型方法,並在那裏進行日期比較。

在你First_Year模型添加了altered_date功能,像這樣:

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 

這通過調用函數得到每一個First_Year模式改變的一年。不幸的是,這個函數需要一個額外的參數 - year - 所以它不能直接從模板中調用。您可以創建一個自定義模板過濾器來解決這個問題:

@register.filter 
def get_altered_year(obj, gar): 
    return obj.altered_date(gar) 

現在你只需要確保你通過一年到您的視圖通過修改你的回報,像這樣:

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 %} 

您可以查看模型方法文檔here。以及自定義模板過濾器here的文檔。

+0

哇,謝謝!這很棒!!! – tim 2013-02-28 17:24:15

+0

但它不工作正確:'int()參數必須是一個字符串或數字,而不是'First_Year',因爲我有First_Year模型,我試着'altered_year = int(year)-int(self.first_year.year )',並且它返回''long'對象沒有屬性'altered_date'' – tim 2013-02-28 17:50:03

+0

我的答案是根據您的組模型中的年份字段量身定製的。你應該把'altered_year'函數放在具有'date'的模型上。如果是「First_Year」模型,則將函數放在那裏並相應地調整我的答案。或張貼您的模型。 – 2013-02-28 17:52:46

0

你的意思是:

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

這僅允許在組具有標誌外鍵

+0

是的,組 - 它是一個related_name。和代碼返回數據庫的值,而不是從視圖 – tim 2013-02-28 14:09:54