Задать поле пользователя в объекте формы, созданном с использованием ModelForm - PullRequest
1 голос
/ 30 января 2012

У меня есть форма регистрации, когда пользователь вводит в нее действительные регистрационные данные, он регистрирует пользователя и перенаправляет пользователя в другую форму для ввода дополнительных данных. Эта новая форма содержит больше данных о пользователе и создана с использованием класса ModelForm ниже:

class UserProfileAddForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ('user')

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

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)

Где поле пользователя - это ForeignKey для объекта User в Django. У меня проблемы с настройкой пользовательского поля для пользователя, который делает запрос. Вот что я попробовал в моей views.py

Первая попытка:

def more(request):
    if request.method == 'POST':
        form = UserProfileAddForm(request.POST)
        if form.is_valid():
            form.save(commit=False)
            form.user = request.user
            form.save()
            return HttpResponseRedirect('/register/success/')
    else:
        form = UserProfileAddForm()
        variables = RequestContext(request, {
            'form': form

Вторая попытка:

def more(request):
    if request.method == 'POST':
        form = UserProfileAddForm(request.POST)
        if form.is_valid():
            form.save(commit=False)
            form.user = User.objects.filter(username=request.user)
            form.save()
            return HttpResponseRedirect('/register/success/')
    else:
        form = UserProfileAddForm()
        variables = RequestContext(request, {
            'form': form
        })
        return render_to_response('registration/more.html', variables)

В любом случае я не пытаюсь сохранить данные в базе данных. Однако он перенаправит меня на страницу успеха, как будто он успешно сохранил.

Ответы [ 3 ]

2 голосов
/ 30 января 2012

form.save() возвращает экземпляр сохраняемой модели. Именно там вам нужно установить пользователя, а затем сохранить этот экземпляр.

profile = form.save(commit=False)
profile.user = request.user
profile.save()

Обратите внимание, что получение пользователя из базы данных на основе значения request.user не имеет смысла, поскольку request.user уже является правильным объектом пользователя.

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

Я предлагаю сделать это изменение во второй попытке:

        with_profile = form.save(commit=False)
        with_profile.user = request.user
        form.save()
        ...

Проблема в том, что вы добавляете свойство user к form объекту вместо form.instance.

Отредактировано

Когда я отправил первый ответ, я ошибся в назначении пользователя.@Dirk прокомментировал это ниже и теперь исправлено.Спасибо @Dirk.Проблема заключалась в том, что набор запросов назначен with_profile.user вместо одной модели.

0 голосов
/ 19 июня 2012

Что вам нужно понять, так это получить экземпляр модели, когда вы это делаете, т.е. в вашем случае

profile = form.save(commit =False)

И когда вы сохраняете объект модели, он не сохраняет никаких отношений «многие ко многим».Что нужно сделать после сохранения модельного объекта.Сделав это,

form.save_m2m()

Итак, просто добавьте последний фрагмент кода после того, как вы сохранили объект модели.

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