django 的用戶分爲三類,匿名用戶,普通用戶,超級用戶html
普通用戶是沒法登陸admin 後臺的的,所以咱們的普通視圖使用這個用戶來管理python
超級用戶是最高權限,能夠登陸admin後臺,能夠使用python manage.py createsuperuser 來建立一個超級用戶django
匿名用戶.dom
普通類型post
普通用戶是沒法登陸admin 後臺的的,所以咱們的普通視圖使用這個用戶來管理
def create_user(self, username, email=None, password=None, **extra_fields): extra_fields.setdefault('is_staff', False) extra_fields.setdefault('is_superuser', False) return self._create_user(username, email, password, **extra_fields)
超級用戶ui
超級用戶是最高權限,能夠登陸admin後臺,能夠使用python manage.py createsuperuser 來建立一個超級用戶
def create_superuser(self, username, email, password, **extra_fields): extra_fields.setdefault('is_staff', True) extra_fields.setdefault('is_superuser', True)
咱們在用戶註冊界面使用的是用戶名稱url
使用內值的form from django.contrib.auth.forms import UserCreationFormcode
建立對應的模板文件signup.htmlorm
<h2>Sign up</h2> <form method="post"> {% csrf_token %} {{ form.as_p }} <button type="submit">Sign up</button> </form>
:views.pycsrf
def signup(request): """ 使用用戶名來註冊 :param request: :return: """ if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data.get('username') raw_password = form.cleaned_data.get('password1') user = authenticate(username=username, password=raw_password) login(request, user) return redirect('article-list') else: form = UserCreationForm() return render(request, 'pre_user/signup.html', {'form': form})
截圖以下
models.py
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 update_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) instance.profile.save()
forms.py
class SignUpForm(UserCreationForm): birth_date = forms.DateField(help_text='Required. Format: YYYY-MM-DD') class Meta: model = User fields = ('username', 'birth_date', 'password1', 'password2', )
views.py
django.contrib.auth import login, authenticate
django.shortcuts import render, redirect
pre_user.forms import SignUpForm
signup(request):
if request.method == 'POST':
form = SignUpForm(request.POST) if form.is_valid(): user = form.save() user.refresh_from_db() # load the profile instance created by the signal user.profile.birth_date = form.cleaned_data.get('birth_date') user.save() raw_password = form.cleaned_data.get('password1') user = authenticate(username=user.username, password=raw_password) login(request, user) return redirect('article-list')
else:
form = SignUpForm()
return render(request, 'pre_user/signup.html', {'form': form})
4 . 模板文件不須要修改
截圖
擴展用戶建立的forms.py
class SignUpForm(UserCreationForm): """ 使用郵箱註冊""" email = forms.EmailField(max_length=254, help_text='Required. Inform a valid email address.') class Meta: model = User fields = ('username', 'email', 'password1', 'password2', )
views.py
(1) 註冊視圖
def signup(request): if request.method == 'POST': form = SignUpForm(request.POST) if form.is_valid(): user = form.save(commit=False) user.is_active = False user.save() current_site = get_current_site(request) subject = 'Activate Your MySite Account' message = render_to_string('pre_user/account_activation_email.html', { 'user': user, 'domain': current_site.domain, 'uid': urlsafe_base64_encode(force_bytes(user.pk)), 'token': account_activation_token.make_token(user), }) # user.email_user(subject, message) # 給該用戶發送郵件 user.email_user(subject=subject, message='message',html_message=message) # 給該用戶發送郵件 return redirect('account_activation_sent') # return HttpResponse("郵箱已經發送,請前往驗證") else: form = SignUpForm() return render(request, 'pre_user/signup.html', {'form': form})
(2) 用戶激活郵箱
def activate(request, uidb64, token): try: uid = force_text(urlsafe_base64_decode(uidb64)) user = User.objects.get(pk=uid) except (TypeError, ValueError, OverflowError, User.DoesNotExist): user = None if user is not None and account_activation_token.check_token(user, token): user.is_active = True user.profile.email_confirmed = True user.save() login(request, user) return redirect('article-list') else: return render(request, 'pre_user/account_activation_invalid.html')
(3) 註冊連接
urls.py
urlpatterns = [ url(r'^signup/$', views.signup), url(r'^login/$', auth_views.login, {'template_name': 'pre_user/login.html', 'authentication_form': LoginForm}), url(r'^activate/(?P<uidb64>[0-9A-Za-z_\-]+)/(?P<token>[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/$', views.activate, name='activate'), url(r'^account_activation_sent/$', views.account_activation_sent, name='account_activation_sent'), ]
(4)模板
account_activation_email.html
{% extends 'pre_user/base.html' %} {% block content %} <div class="container"> <div class="row"> <div class="jumbotron"> {% autoescape off %} Hi {{ user.username }}, Please click on the link below to confirm your registration: http://{{ domain }}{% url 'activate' uidb64=uid token=token %} {% endautoescape %} </div> </div> </div> {% endblock %}
account_activation_sent.html
{% extends 'pre_user/base.html' %} {% block content %} <div class="container"> <div class="row"> <div class="jumbotron"> 郵件已經發送 </div> </div> </div> {% endblock %}
account_activation_invalid.html
{% extends 'pre_user/base.html' %} {% block content %} <div class="container"> <div class="row"> <div class="jumbotron"> 郵件格式不合法 </div> </div> {% endblock %}