2017-08-13 8 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 %} 
私がに行くとき

は/それはまだ元のユーザーがUserProfileフィールドのUserモデル(usernameemailfirst_namelast_namepassword)が、いずれも付属してフィールドをフォームにサインアップ表示登録し、これはなぜですか?

+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' 
    ) 
関連する問題