首页 > 技术文章 > Django入门与实践-第14章:用户注册(完结)

larken 2018-09-05 10:24 原文

django-admin startapp accounts

INSTALLED_APPS = [
    'accounts',
]
# myproject/urls.py
from django.conf.urls import url
from django.contrib import admin
from accounts import views as accounts_views
from boards import views

urlpatterns = [
    url(r'^$', views.home, name='home'),
    url(r'^signup/$', accounts_views.signup, name='signup'),
    url(r'^boards/(?P<pk>\d+)/$', views.board_topics, name='board_topics'),
    url(r'^boards/(?P<pk>\d+)/new/$', views.new_topic, name='new_topic'),
    url(r'^admin/', admin.site.urls),
]


#accounts/views.py
from django.shortcuts import render
def signup(request):
    return render(request, 'signup.html')


<!--templates/signup.html-->    
{% extends 'base.html' %}
{% block content %}
    <h2>Sign up</h2>
{% endblock %}     
<!--templates/base.html-->
{% load static %}<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{% block title %}Django Boards{% endblock %}</title>
        <link href="https://fonts.googleapis.com/css?family=Peralta" rel="stylesheet">
        <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
        <link rel="stylesheet" href="{% static 'css/app.css' %}">
        {% block stylesheet %}{% endblock %} <!-- 这里 -->
    </head>

    <body>
        {% block body %} <!-- 这里 -->
          <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
              <div class="container">
                <a class="navbar-brand" href="{% url 'home' %}">Django Boards</a>
              </div>
          </nav>
          <div class="container">
              <ol class="breadcrumb my-4">
                {% block breadcrumb %}
                {% endblock %}
              </ol>
                {% block content %}
                {% endblock %}
          </div>
      {% endblock body %} <!-- 这里 -->
    </body>
</html>


<!--templates/signup.html-->
{% extends 'base.html' %}
{% block body %}
    <h2>Sign up</h2>
{% endblock %}
#accounts/views.py
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render

def signup(request):
    form = UserCreationForm()
    return render(request, 'signup.html', {'form': form})

    
<!--templates/signup.html-->
{% extends 'base.html' %}
{% block body %}
    <div class="container">
        <h2>Sign up</h2>
        <form method="post" novalidate>
            {% csrf_token %}
            {{ form.as_p }}
            <button type="submit" class="btn btn-primary">Create an account</button>
        </form>
    </div>
{% endblock %}
<!--看起来有一点乱糟糟,是吧?我们可以使用form.html模板使它看起来更好:-->
<!--templates/signup.html-->
{% extends 'base.html' %}
{% block body %}
    <div class="container">
        <h2>Sign up</h2>
        <form method="post" novalidate>
            {% csrf_token %}
            {% include 'includes/form.html' %}
            <button type="submit" class="btn btn-primary">Create an account</button>
        </form>
    </div>
{% endblock %}
<!--templates/includes/form.html-->
{% load widget_tweaks %}
{% for field in form %}
    <div class="form-group">
        {{ field.label_tag }}

        {% if form.is_bound %}
            {% if field.errors %}
                {% render_field field class="form-control is-invalid" %}
                {% for error in field.errors %}
                    <div class="invalid-feedback">
                      {{ error }}
                    </div>
                {% endfor %}
            {% else %}
                    {% render_field field class="form-control is-valid" % }
            {% endif %}
        {% else %}
            {% render_field field class="form-control" %}
        {% endif %}

        {% if field.help_text %}
          <small class="form-text text-muted">
              {{ field.help_text|safe }} <!-- 新的代码 -->
              {{ field.help_text }}
          </small>
        {% endif %}
    </div>
{% endfor %}
# accounts/views.py
from django.contrib.auth import login as auth_login
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect

def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            return redirect('home')
    else:
        form = UserCreationForm()
    return render(request, 'signup.html', {'form': form})
<!--templates/base.html-->
{% load static %}<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>{% block title %}Django Boards{% endblock %}</title>
        <link href="https://fonts.googleapis.com/css?family=Peralta" rel="stylesheet">
        <link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
        <link rel="stylesheet" href="{% static 'css/app.css' %}">
        {% block stylesheet %}{% endblock %} <!-- 这? -->
    </head>
    <body>
        {% block body %} <!-- 这? -->
            <nav class="navbar navbar-expand-sm navbar-dark bg-dark">
                <div class="container">
                  <a class="navbar-brand" href="{% url 'home' %}">Django Boards</a>
                  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#mainMenu" aria-controls="mainMenu" aria-expanded="false" aria-label="Toggle navigation">
                      <span class="navbar-toggler-icon"></span>
                  </button>
                    <div class="collapse navbar-collapse" id="mainMenu">
                        <ul class="navbar-nav ml-auto">
                            <li class="nav-item">
                                <a class="nav-link" href="#">{{ user.username }}</a>
                            </li>
                        </ul>
                    </div>
                </div>
            </nav>
          <div class="container">
            <ol class="breadcrumb my-4">
                {% block breadcrumb %}
                {% endblock %}
            </ol>
              {% block content %}
              {% endblock %}
          </div>
      {% endblock body %} <!-- 这? -->
    </body>
</html>
# accounts/forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class SignUpForm(UserCreationForm):
    email = forms.CharField(max_length=254, required=True, widget=forms.EmailInput())
    
    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

        
# accounts/views.py
from django.contrib.auth import login as auth_login
from django.shortcuts import render, redirect
from .forms import SignUpForm

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            return redirect('home')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})
#static/css/accounts.css
body {
    background-image: url(../img/hip-square);
}

.logo {
    font-family: 'Peralta', cursive;
}

.logo a {
    color: rgba(0,0,0,.9);
}

.logo a:hover,
.logo a:active {
    text-decoration: none;
}


<!--templates/signup.html-->
{% extends 'base.html' %}
{% load static %}
{% block stylesheet %}
  <link rel="stylesheet" href="{% static 'css/accounts.css' %}">
{% endblock %}

{% block body %}
    <div class="container">
        <h1 class="text-center logo my-4">
          <a href="{% url 'home' %}">Django Boards</a>
        </h1>
        <div class="row justify-content-center">
            <div class="col-lg-8 col-md-10 col-sm-12">
                <div class="card">
                    <div class="card-body">
                        <h3 class="card-title">Sign up</h3>
                        <form method="post" novalidate>
                            {% csrf_token %}
                            {% include 'includes/form.html' %}
                            <button type="submit" class="btn btn-primary btn-block">Create an account</button>
                        </form>
                    </div>
                    <div class="card-footer text-muted text-center">Already have an account? 
                        <a href="#">Log in</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

 

推荐阅读