我已经在以下位置询问与此相关的问题 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模型?
我对传递实例值感到困惑。 我和每个人都一样吗?还是我做错了?
答案 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)