扩展用户模型Django
问题描述:
我想将每个用户与具有生物,位置和生日等信息的用户配置文件关联起来。我希望这些字段的填写时间与实际的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
模型(username
,email
,first_name
,last_name
和password
),但UserProfile
领域没有任何领域,这是为什么?
答
做保存用户个人资料信息是正确的方法,解决了所有的问题
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'
)
您不支付个人资料表单到模板。 –