Django Редактирование формы модели профиля пользователя для текущего пользователя - PullRequest
0 голосов
/ 22 марта 2020

Я много искал по этому вопросу, и все представленные вопросы и ответы никогда не бывают ясными и не соответствуют цели, возможно, я ошибаюсь. Я только недавно начал Python и Django, поэтому очень мало знаю об этом. Я создаю веб-сайт и выполнил аутентификацию basi c с использованием Django и даже добавил аутентификацию facebook с использованием social- django. Эта часть все работает отлично. Теперь я перехожу к информации профиля и как ее обновить после регистрации на веб-сайте.

У меня есть следующий UserProfile в models.py:

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    first_name = models.TextField()
    last_name = models.TextField()
    email_address = models.EmailField()
    phone_number = models.TextField()

В Forms.py тестировании Форма:

class UserProfileForm(forms.ModelForm):
    class Meta:
        model = UserProfile
        fields = ['first_name','last_name','email_address']

Затем в views.py у меня есть функция:

def myprofile(request):
    if request.method == 'POST':
        form = UserProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            user_profile = UserProfile.objects.get(user=request.user)
    if request.method == 'GET':
        user_profile = UserProfile.objects.get(user=request.user)
        form = UserProfileForm(instance=user_profile)

    return render(request, 'pandp/myprofile.html',
                 {'user_profile' : user_profile, 'form' : form})

И, наконец, myprofile. html:

<div class="profile-details">
   <form method="post">{% csrf_token %}
     {{ form.as_p }}
     <input type="submit" value="Update">
   </form>
</div>

Я боролся с самого начала фактически загружать только UserProfile вошедшего в систему пользователя, кажется, что мне удалось сделать это, используя UserProfile.objects.get (user = request.user) и UserProfileForm (request.POST , instance = request.user) но не совсем уверен, что это правильный способ сделать это. В настоящее время мой код заполняет имя_файла, фамилию и адрес электронной почты в форме вывода html, но при обновлении поля и нажатии кнопки «Обновить» он обновляется, но не сохраняется в базе данных.

Недостаточно form.save () или я что-то не так делаю?

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

Возможно, это длинный и сложный вопрос, но, надеюсь, у вас возникла проблема, и, надеюсь, это поможет другим людям, у которых похожая проблема.

1 Ответ

1 голос
/ 22 марта 2020
def myprofile(request):
    if request.method == 'POST':
        user_profile = UserProfile.objects.get(user=request.user)
        form = UserProfileForm(request.POST, instance=user_profile)
        ...

Вам необходимо получить экземпляр UserProfile и передать его в UserProfileForm, как @ willem-van-onsem, упомянутый в комментарии.

...