Как использовать ModelForm для сохранения данных из пользовательских форм ввода - PullRequest
0 голосов
/ 11 января 2012

Я думаю, что мне не хватает ключевого принципа использования ModelForm и Forms для сохранения данных в моей базе данных. У меня есть модель UserProfile, в которой хранятся определенные данные, которые не включены в класс User

Models.py:

class UserProfile(models.Model):
    GRADE_YEAR_CHOICES = (
        ('FR', 'Freshman'),
        ('SO', 'Sophomore'),
        ('JR', 'Junior'),
        ('SR', 'Senior'),
        ('GR', 'Graduate')
    )

    school = models.CharField(max_length=64)
    grade_year = models.CharField(max_length=2, choices=GRADE_YEAR_CHOICES)
    gpa = models.DecimalField(decimal_places=2, max_digits=6, blank=True, null=True)
    user = models.ForeignKey(User, unique=True)

My Forms.py выглядит так:

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile

Вид для этого выглядит следующим образом:

def more(request):
    if request.method == 'POST':
        form = UserProfileForm(request.POST)
        if form.is_valid():
            form = UserProfileForm(request.POST,
                school = form.cleaned_data['school'],
                grade_year = form.cleaned_data['grade_year'],
                gpa = form.cleaned_data['gpa'],
                user = form.cleaned_data['user']
            )
            form.save()
            return HttpResponseRedirect('/success')
    else:
        form = UserProfileForm()

        variables = RequestContext(request, {
            'form': form
        })
        return render_to_response('more.html', variables)

Форма отображается правильно со всеми полями из модели, которую я указал, но когда я пытаюсь сохранить данные, я получаю:

__init__() got an unexpected keyword argument 'grade_year'

Что мне здесь не хватает? Я понимаю, что мне может не хватать большой концепции, поэтому любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 11 января 2012

Вы передаете UserProfileForm аргумент ключевого слова, который ссылается на поля вашей модели, чего он не ожидает.

Просто вызовите save() после создания экземпляра формы - если у нее было cleaned_data (то есть форма действительна), тогда поля POSTed уже сопоставлены с экземпляром с помощью ModelForm magic.

   if form.is_valid():
            form.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...