我想使用facebook登录以及可选的电子邮件/密码登录/注册为时尚科技应用程序的用户创建注册。
我一直坚持如何完成这个过程(博客中有太多的例子告诉我矛盾的信息,而Django文档并没有很清楚地解释我的需要)。
所以我的问题是:
我猜我必须首先从模型/逻辑开始,所以:
这是我的models.py到目前为止,我已经为用户添加了字段,一旦正式登录,他们就可以从他们的个人资料中访问这些字段。但当然首先会要求他们使用他们的电子邮件,用户名和密码登录(如果选择密码/电子邮件登录或注册)。
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
#custom user model fro Users
class MyUser(AbstractBaseUser):
username = models.CharField(max_length=40, db_index=True)
first_name = models.CharField(max_length=254, blank=True)
last_name = models.CharField(max_length=254, blank=True)
email = models.EmailField(max_length=254, null=False, unique=True, blank=True)
birthday = models.DateField(null=True, blank=True)
city = models.CharField(max_length=50, blank=True)
state = models.CharField(max_length=50, blank=True)
user_title = models.CharField(max_length=254, blank=True)
user_points = models.IntegerField(null=False, blank=True)
avatar = FileField()
#admin level and additional infomation
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['email', 'username']
class MyUserManager(object):
"""Creates and saves a User with the given first_name, last_name, birthday,"""
def create_user(self, email, username, first_name, last_name, birthday, city, state, use
r_title, user_points, avatar, password=None):
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=MyUserManager.normalize_email(email),
first_name=first_name,
last_name=last_name,
birthday=birthday,
city=city
state=state,
user_title=user_title,
user_points=user_points,
avatar=avatar,
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, first_name, last_name, birthday, city, state, user_title, user_points, avatar, password):
user = self.create_user(email,
password=password,
first_name=first_name,
last_name=last_name,
birthday=birthday,
city=city
state=state,
user_title=user_title,
user_points=user_points,
avatar=avatar,
)
user =
答案 0 :(得分:2)
首先,您的自定义用户模型乍一看对我来说很好。
要将自定义模型与Django管理员正确集成,您应将is_admin
字段替换为Django admin is_staff
和is_superuser
使用的两个字段。有关详细信息see the documentation here。这将阻止非员工(非管理员)用户访问管理员,并允许您定义超级用户以授予完全访问权限。
编辑:发现更简单的方法,只是子类AbstractUser而不是AbstractBaseUser,这是详细的here。这是您的代码,修改并清除任何冗余字段(已在父类中实现)
class MyUser(AbstractUser):
birthday = models.DateField(null=True, blank=True)
city = models.CharField(max_length=50, blank=True)
state = models.CharField(max_length=50, blank=True)
user_title = models.CharField(max_length=254, blank=True)
user_points = models.IntegerField(null=False, blank=True)
avatar = models.FileField()
现在,要完成此过程,您只需要为您的网页撰写网址和视图,并在适当情况下使用@login_required装饰器,以防止"anonymous" users访问这些网页。
实现@login_required装饰器的示例视图:
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def user_profile(request):
# render your template with the RequestContext
return render('profile.html')