我无法在Django Views.py中同时更新两个模型

时间:2020-09-14 15:49:14

标签: python django django-models django-forms django-views

我已经在以下位置询问与此相关的问题 How can I update first_name, last_name & email of Django model User and update other field in separate models

但是我没有找到合适的解决方案。这就是为什么我使这个问题类似于那个问题。

我有 pages.views.py

from django.shortcuts import render, redirect
from .forms import CreateUserForm
from accounts.models import Account
from django.contrib import messages

def signupPage(request):
    if request.user.is_authenticated:
        return redirect('/')
    else:
        form = CreateUserForm()
        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if form.is_valid():
                user = form.save()

                # focus on this line
                Account.objects.create(user=user)

                messages.success(request, 'Signup success. Now, you can login.')
                return redirect('login')
            else:
                messages.warning(request, 'Signup failed. Please, try again.')
        context = {'form':form}
        return render(request, 'signup.html', context)

此外,我还有 accounts.models.py

from django.db import models
from django.contrib.auth.models import User

class Account(models.Model):

    user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)

    # This field is used for to update django model User
    first_name=models.CharField(max_length=30, null=True, blank=False)
    last_name=models.CharField(max_length=30, null=True, blank=False)
    email = models.EmailField(max_length=30, null=True, blank=True)

    profile_photo = models.ImageField(upload_to='profile', null=True)
    mobile_number = models.PositiveBigIntegerField(null=True)
    date_of_birth = models.DateField(auto_now_add=False, auto_now=False, null= True)
    zip_code = models.IntegerField(null=True)
    address = models.CharField(max_length=225, null=True)
    website = models.URLField(max_length=100, null=True)
    bio = models.CharField(max_length=225, null=True)

Accounts.view.py 中:

from django.shortcuts import render, redirect
from .forms import AccountForm
from .models import Account
from pages.forms import CreateUserForm
from django.contrib import messages
from django.contrib.auth.models import User

首先,我尝试过:

def profileSettingsPage(request, pid):
    user= User.objects.get(id=pid)
    form = AccountForm(instance=user)
    if request.method == 'POST':
        form = AccountForm(request.POST, request.FILES, instance=user)
        if form.is_valid():

            user.first_name = form.cleaned_data.get('first_name')
            user.last_name = form.cleaned_data.get('last_name')
            user.email = form.cleaned_data.get('email')
            user.save()

            form.save()

            messages.success(request, 'Profile saved.')
        else:
            messages.warning(request, 'Faile to saved profile')
    context = {'form':form}
    return render(request, 'profile-settings.html', context)

但是它将仅保存用户模型,而不保存AccountForm。

然后我替换user = request.user。同样,它仅保存用户模型,而不保存AccountForm。

同样,我替换user = Account.objects.get(id=pid)。然后,我遇到错误 DoesNotExist:帐户匹配查询不存在。

即使我尝试过

def profileSettingsPage(request, pid):
    form = AccountForm()
    if request.method == 'POST':
        form = AccountForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            user = User.objects.get(id=pid)
            user.first_name = form.cleaned_data.get('first_name')
            user.last_name = form.cleaned_data.get('last_name')
            user.email = form.cleaned_data.get('email')
            user.save()
            messages.success(request, 'Profile saved.')
        else:
            messages.warning(request, 'Faile to saved profile')
    context = {'form':form}
    return render(request, 'profile-settings.html', context)

它保存了两个模型,但是问题在于它创建了一个新模型,并将空值保存在Account模型的ForeignKey中,其他字段按原样保存,还用这些值保存了User模型。

现在,我的问题是如何更新在pages.views.py和Django User模型中同时创建的Account模型?

我对传递实例值感到困惑。 我和每个人都一样吗?还是我做错了?

1 个答案:

答案 0 :(得分:0)

class Account(models.Model):

    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)

    # This field is used for to update django model User
    first_name=models.CharField(max_length=30, null=True, blank=False)
    last_name=models.CharField(max_length=30, null=True, blank=False)
    email = models.EmailField(max_length=30, null=True, blank=True)

    profile_photo = models.ImageField(upload_to='profile', null=True)
    mobile_number = models.PositiveBigIntegerField(null=True)
    date_of_birth = models.DateField(auto_now_add=False, auto_now=False, null= True)
    zip_code = models.IntegerField(null=True)
    address = models.CharField(max_length=225, null=True)
    website = models.URLField(max_length=100, null=True)
    bio = models.CharField(max_length=225, null=True)

def profileSettingsPage(request, pid):
    form = AccountForm()
    if request.method == 'POST':
        user = User.objects.get(id=pid)
        user.first_name = request.POST.get('first_name')
        user.last_name = request.POST.get('last_name')
        user.email = request.POST.get('email')
        user.save()
        instance = Account.objects.get(user=user)
        form = AccountForm(request.POST, request.FILES,instance=instance)
        if form.is_valid():
            form.save()
            messages.success(request, 'Profile saved.')
        else:
            messages.warning(request, 'Faile to saved profile')
    context = {'form':form}
    return render(request, 'profile-settings.html', context)