2014-02-09 4 views
0

Я пытаюсь создать форму, чтобы пользователь мог загрузить аватар в свой профиль. У меня есть класс, который выглядит следующим образом:Django. Доступ к дополнительному полю пользователя

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 
    picture = models.FileField(upload_to='media/images', blank=True, null=True) 

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

if request.method == 'POST': 
     userForm = SignupForm(request.POST, instance=user) 
     profileForm = ProfileForm(request.POST, request.FILES) 
     if userForm.is_valid(): 
      ... 
      user.profile.picture = request.POST['picture'] 
        ... 
      profileForm.save() 
      return HttpResponseRedirect('/') 
        ... 

, а затем передать его в шаблон. Я где-то читал, что могу использовать такое поле через related_name, указанный в моделях, так вот что я пробовал. Но когда я пытаюсь загрузить изображение он говорит: User has no profile.

Также я читал о get_profile() функцию много, но как я понял, что это depricatred настоящее.

Итак, пожалуйста, расскажите, как я могу получить доступ к этому полю?
Может быть, я все делаю неправильно? Если да, то каков правильный способ делать такие вещи?

ответ

1

Вам не хватает шага здесь. Вы должны проверить, что и пользователь и формы профиля действительны. Затем вам нужно сохранить форму пользователя, чтобы получить объект User. Затем вам нужно создать объект профиля, связать его с пользователем и сохранить его.

Я не знаю, почему вы настраиваете изображение профиля отдельно - оно обязательно должно быть частью формы профиля и будет сохранено рядом с ним.

+0

Спасибо за ответ! Я добавил подтверждение для обеих форм. Можете ли вы привести пример о том, как создать объект профиля? Когда вы говорите об отдельном профиле, вы имеете в виду 2 модели? Думаю, мне это не нужно, но я не знаю, как я могу расширить модель пользователя по умолчанию другим способом. –

0

Вот где я думаю, что вы путаюсь:

userForm = SignupForm(request.POST, instance=user) 
profileForm = ProfileForm(request.POST, request.FILES) 

Вы, используя две различные формы, в то же время, но только тестирующих первый:

if userForm.is_valid(): 

И то, что вы» re get является User has no profile., потому что, хотя пользователь существует, профиль не работает (не до запуска profileForm.save()). Помните, что это две разные модели. И даже тогда, вы также делаете это неправильно по двум причинам:

  • картина будет находиться в request.FILES и не request.POST, потому что, ну, файл
  • вы пытаетесь присвоить картинку, чтобы user.profile.picture - но это не имеет смысла, потому что вы должны назначить его профилю, а затем связать этот профиль с пользователем (помните, что пользователь является полем в модели профиля). И, конечно же, если картина является частью формы вам не нужно делать это в любом случае

Так, по существу, это:

profileForm = ProfileForm(request.POST, request.FILES) 
profileForm.instance.user = request.user #link the profile to current user 
if profileForm.is_valid(): 
    profileForm.save() #now you have a profile 
+0

Благодарим за отзыв! Итак, я сделал то, что вы посоветовали. Теперь «print (profileForm.instance.user)» возвращает текущего пользователя, но когда я пытаюсь сохранить profileForm, он говорит: «column user_id не уникален». Как я понял о сохранении изображения, он должен выглядеть следующим образом: «user.profile.picture = request.FILES ['picture']" и разве это не должно быть выполнено до сохранения профиля? Хорошо .. Я действительно смущен о том, что делать дальше: \ Есть ли способ, которым я могу все это сделать только в одной модели? –

+0

, если профиль уже существует, вам нужно использовать аргумент 'instance' в вашем вызове в форме:' ProfileForm (request.POST, request.FILES, instance = ...) '. Вы можете использовать некоторые условия, чтобы выяснить, имеет ли пользователь связанный объект профиля или нет – yuvi

Смежные вопросы