2017-08-13 154 views
0

我想将每个用户与具有生物,位置和生日等信息的用户配置文件关联起来。我希望这些字段的填写时间与实际的User型号注册时间相同。扩展用户模型Django

models.py:

from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 
from django.dispatch import receiver 

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

forms.py:

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 
from .models import Profile 

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(required = True) 

    class Meta: 
     model = User #model User comes with username, email, first name, last name , pass1 and pass2 fields 
     fields = (
      'username', 
      'email', 
      'first_name', 
      'last_name', 
      'password1', 
      'password2' 
     ) 

    def save(self, commit = True): 
     user = super(RegistrationForm, self).save(commit = False) 
     user.first_name = self.cleaned_data['first_name'] 
     user.last_name = self.cleaned_data['last_name'] 
     user.email = self.cleaned_data['email'] 

     #note password is saved automatically in User models original save() 
     # function, everything else needs to be done manually as done above 
     if commit: 
      user.save() 

      return user 

class ProfileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('location','bio') 

views.py

from django.shortcuts import render, redirect 
from .forms import RegistrationForm,ProfileForm 



def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     profile_form = ProfileForm(request.POST) 
     if form.is_valid() and profile_form.is_valid(): 
      form.save() 
      profile_form.save() 
      return redirect('login') 

    else: 
     form = RegistrationForm() 
     profile_form = ProfileForm() 


    return render(request, 'accounts/register.html', {'form': form}) 

register.html

{% extends 'accounts/base.html' %} 

{% block head %} 
    <title> Sign Up</title> 
{% endblock %} 
{% block body %} 
    <h2>Sign up</h2> 

    <form method="post"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    {{ profile_form.as_p }} 
    <button type="submit">Sign up</button> 
    </form> 
{% endblock %} 

当我去/注册它仍显示原来的用户注册表格附带User模型(usernameemailfirst_namelast_namepassword),但UserProfile领域没有任何领域,这是为什么?

+0

您不支付个人资料表单到模板。 –

回答

0

做保存用户个人资料信息是正确的方法,解决了所有的问题

from django.contrib.auth.base_user import AbstractBaseUser 

class MyUser(AbstractBaseUser, PermissionsMixin): 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 
    phone = models.EmailField(_('email address'), unique=True) 
    avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) 

修改设置

AUTH_USER_MODEL = 'project.MyUser' 

,当你希望得到您的MYUSER模型

from django.contrib.auth import get_user_model 
MyUser = get_user_model() 

现在,您在代码中完成了所有工作,使其完美工作

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(required = True) 

    class Meta: 
     model = MyUser 
    fields = (
     'username', 
     'bio', 
     'birth_date', 
     'avatar', 
     'password1', 
     'password2' 
    )