Django额外的用户注册详细信息没有保存到数据库

时间:2017-10-22 16:55:20

标签: python mysql django

我一直在努力扩展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')

1 个答案:

答案 0 :(得分:0)

您的表单元模型为User,因此当您尝试:

profile = form.save(commit=False)

变量profileUser类的一个实例,因此,由于您有创建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()
相关问题