我一直在努力扩展django用户个人资料,但它不会将额外的细节保存到数据库,这是一个商业,学生,游客的用户类型,我无法弄清楚原因。任何帮助,将不胜感激。
它不会在DB中保存为null,而是保存为空白。
将python 3与最新版本的django一起使用。
Forms.py:
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.forms import ModelChoiceField
from django.contrib.auth.models import User, Group
from .models import UserProfile
class RegisterForm(UserCreationForm):
first_name = forms.CharField(max_length=50, required=False,
help_text='Not required.')
last_name = forms.CharField(max_length=50, required=False,
help_text='Not required.')
email = forms.EmailField(max_length=300, required=True,
help_text='Please input a valid email address.')
user_types = ((1, 'Business'), (2, 'Student'), (3, 'Tourist'))
user_type = forms.ChoiceField(choices = user_types)
class Meta:
model = User
fields = ('username', 'first_name', 'last_name', 'email', 'user_type', 'password1', 'password2',)
models.py
from django.db import models
from django.contrib.auth.models import User
from django.dispatch import receiver
from django.db.models.signals import post_save
from django import forms
ADMIN = 0
BUSINESS = 1
STUDENT = 2
TOURIST = 3
class UserProfile(models.Model):
user_choices = ( (0, 'Admin'),
(1, 'Business'),
(2, 'Student'),
(3, 'Tourist'),
)
# Link UserProfile to User model
user = models.OneToOneField(User, on_delete=models.CASCADE)
# Add attributes to the user model
user_type = models.CharField(max_length = 50,
choices = user_choices,
# default = 'Business',
blank = False)
def __str__(self):
return self.user.username
@receiver(post_save, sender = User)
def create_user_profile( sender, instance, created, **kwargs):
if created:
UserProfile.objects.create(user = instance)
instance.userprofile.save()
Views.py
def register(request):
if request.method == 'POST':
form = RegisterForm(data=request.POST)
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.save()
# form.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
user_group = form.cleaned_data.get('user_type')
user = authenticate(username = username, password = password)
login(request, user)
if user_group == 'Business':
return render(request, 'users/business.html')
elif user_group == 'Student':
return render(request, 'users/student.html')
elif user_group == 'Tourist':
return render(request, 'users/tourist.html')
else:
return redirect('main:index')
else:
print(RegisterForm.errors)
else:
form = RegisterForm()
return render(request, 'users/register.html', {'form': form})
# return HttpResponseRedirect(reverse('main:index'))
def business_view(request):
return render(request, 'users/business.html')
def student_view(request):
return render(request, 'users/student.html')
def tourist_view(request):
return render(request, 'users/tourist.html')
答案 0 :(得分:0)
您的表单元模型为User
,因此当您尝试:
profile = form.save(commit=False)
变量profile
是User
类的一个实例,因此,由于您有创建UserProfile
实例的信号,因此您应该使用以下代码:
user = form.save()
profile = user.userprofile
user_group = form.cleaned_data.get('user_type')
profile.user_type = user_group
profile.save()
而不是:
profile = form.save(commit=False)
profile.user = request.user
profile.save()