2013-02-28 5 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. Как вы можете понять, существует 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 

Без модели Марка, 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

wow, спасибо! Здорово!!! – tim

+0

, но он не работает корректно: аргумент 'int() должен быть строкой или числом, а не« первым_Year », потому что у меня есть модель First_Year, я пытаюсь« altered_year = int (year) -int (self.first_year.year)) ', и он возвращает' 'long 'объект не имеет атрибута' altered_date'' – tim

+0

Мой ответ настроен на поле года, которое находится в вашей группе. Вы должны поместить функцию 'altered_year' в зависимости от того, какая модель имеет« дату ». Если это модель «First_Year», тогда установите там функцию и соответствующим образом настройте мой ответ. Или разместите свои модели. –

0

Вы имеете в виду:

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

Это позволит только если группы имеет внешний ключ от знака

+0

да, группы - его родственное имя. И код возвращает значения из db, а не из просмотров – tim