@KarenG

Как автоматически инкрементировать значение в форме?

Добрый день, перелопатил всю документацию, перепробовал множество способов, однако желаемого результата так и не могу получить.

Есть форма, которая привязанная к модели User. У модели User есть атрибут "term", который должен быть увеличен на 1 при каждом клике на сабмит.
Вот, что написал:

models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.forms import ModelForm

class User(AbstractUser):
    term = models.IntegerField(default=1)


forms.py
from django import forms
from .models import User

class UserProfile(forms.ModelForm):
    term = forms.IntegerField()
    class Meta:
        model = User
        fields = ['term']


views.py
def main(request):
	args = {}
	args.update(csrf(request))
	args['term'] = auth.get_user(request).term
	if request.method == 'POST':
	    a = User.objects.get(pk = 1)
	    form = UserProfile(request.POST or None, instance = a)
	    if form.is_valid():
	        term = auth.get_user(request).term
	        term += 1
	        form.save()
	        return redirect ('/base/main.html')
	    else:
	        args['form'] = form
	return render_to_response('base/main.html', RequestContext(request, args))


При открытии страницы выводит поле, где только можно самому указать число. Я понимаю, что проблема в самом представлении форм, но, видимо, не хватает понимания... помогите, пожалуйста
  • Вопрос задан
  • 369 просмотров
Решения вопроса 1
@deliro
Зачем вообще в meta.fields нужен term, если он инкременируется?

user = form.save(commit=False)  # Получаем обновлённую модель юзера из формы.
user.term += 1
user.save()


P.S. Используйте Class Based Views. Неужели, вам не жалко своё время?

from django.views.generic import *

class YourFormView(FormView):
    form_class = UserProfile
    template_name = 'path/to/your_template.html'

    def form_valid(self, form):  # Вызывается, если форма is_valid
        user = form.save(commit=False)
        user.term += 1
        user.save()
        return # Чего вы хотите вернуть (обычно это редирект)

    def form_invalid(self, form):
        # Что-то делаем, если форма невалидна. По-умолчанию, джанго возвращает
        # на ту же страницу и показывает ошибки в форме.


Но ещё лучше переопределить метод save у формы и инкременировать term там.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы