扩展django的user表

本文介绍如何通过定义新的Profile模型并使用一对一关系映射到Django的内置User模型来扩展User表,同时还包括了如何设置多媒体文件上传路径、定义表单以便在前端编辑数据以及实现编辑视图函数的方法。
扩张django的user表来增加user中的字段

定义模型

from django.db import models
from django.conf import settings


class Profile(models.Model):
    #一对一的关系映射
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    date_of_birth = models.DateField(blank=True, null=True)
    photo = models.ImageField(upload_to='users/%Y/%m/%d', blank=True)

    def __str__(self):
        return self.user.username

为了Django能在开发服务中管理用户上传的多媒体文件,在项目setting.py文件中添加如下设置:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')

MEDIA_URL 是管理用户上传的多媒体文件的主URL,MEDIA_ROOT是这些文件在本地保存的路径。我们动态的构建这些路径相对我们的项目路径来确保我们的代码更通用化。


在主urls 配置 文件的访问路径
from django.conf import settings
from django.conf.urls.static import static
if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL,
                        document_root=settings.MEDIA_ROOT)

定义modelform 让在前端能修改user模型 进行校验:

from .models import Profile

class UserEditForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('first_name', 'last_name', 'email')

class ProfileEditForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('date_of_birth', 'photo')

UserEditForm:允许用户编辑它们的first name,last name, e-mail 这些储存在User模型(model)中的内置字段。
ProfileEditForm:允许用户编辑我们存储在定制的Profile模型(model)中的额外数据。用户可以编辑他们的生日数据以及为他们的profile上传一张照片。

编辑视图函数

from .forms import LoginForm, UserRegistrationForm, \
UserEditForm, ProfileEditForm
@login_required
def edit(request):
    if request.method == 'POST':
        user_form = UserEditForm(instance=request.user,
                                data=request.POST)
        profile_form = ProfileEditForm(instance=request.user.profile,
                                        data=request.POST,
                                        files=request.FILES)
        if user_form.is_valid() and profile_form.is_valid():
            user_form.save()
            profile_form.save()
    else:
        user_form = UserEditForm(instance=request.user)
        profile_form = ProfileEditForm(instance=request.user.profile)
    return render(request,
                 'account/edit.html',
                 {'user_form': user_form,
                 'profile_form': profile_form})
Django中有一个内置的User模型,但是如果需要添加一些额外的字段或方法,可以通过扩展User模型来实现。 方法1:使用AbstractBaseUser和BaseUserManager 可以通过继承AbstractBaseUser和BaseUserManager来创建自定义User模型,具体步骤如下: 1. 创建一个新的app ``` python manage.py startapp accounts ``` 2. 在models.py中创建自定义User模型 ```python from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.db import models class CustomUserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError('The Email field must be set') email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) user.save() return user def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True) return self.create_user(email, password, **extra_fields) class CustomUser(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True) name = models.CharField(max_length=30, blank=True) is_staff = models.BooleanField(default=False) is_active = models.BooleanField(default=True) date_joined = models.DateTimeField(auto_now_add=True) objects = CustomUserManager() USERNAME_FIELD = 'email' REQUIRED_FIELDS = [] def __str__(self): return self.email def get_full_name(self): return self.name def get_short_name(self): return self.name ``` 3. 修改setting.py中的AUTH_USER_MODEL ```python AUTH_USER_MODEL = 'accounts.CustomUser' ``` 4. 执行数据库迁移 ``` python manage.py makemigrations python manage.py migrate ``` 5. 创建超级用户 ``` python manage.py createsuperuser ``` 方法2:使用AbstractUser Django还提供了一个AbstractUser模型,可以通过继承该模型来扩展User模型。 具体步骤如下: 1. 创建一个新的app ``` python manage.py startapp accounts ``` 2. 在models.py中创建自定义User模型 ```python from django.contrib.auth.models import AbstractUser class CustomUser(AbstractUser): name = models.CharField(max_length=30, blank=True) ``` 3. 修改setting.py中的AUTH_USER_MODEL ```python AUTH_USER_MODEL = 'accounts.CustomUser' ``` 4. 执行数据库迁移 ``` python manage.py makemigrations python manage.py migrate ``` 5. 创建超级用户 ``` python manage.py createsuperuser ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值