部落格
Apphook 從零開始
翻譯自:BUILDING DJANGO-CMS APPHOOKS
如果你和我一樣懶惰,你一定也不喜歡一樣的 code 寫了一遍又一遍,
那你一定要知道 Django CMS apphook,apphook 可以節省你的開發時間,反覆運用你的原,不用同樣的程式碼又在寫一遍
今天就用我最常客製化的 login 為例,來介紹 Apphook。
首先到 Django CMS 的專案底下,或如果還沒有可以依照底下的步驟快速的新增:
1. 建一個虛擬環境
# 以 conda 建虛擬環境 conda create -n env python=3.6 conda activate env # 若已下載過可以跳過這個指令 pip install djangocms-installer # 新建 django cms 專案 djangocms mysite
接下來到專案目錄下,並執行專案
python manage.py startapp django_login python manage.py runserver 8080
到 mysite/settings.py 中,把 'django_login' 加進 INSTALLED_APPS 中
再到 mysite/urls.py 中新增以下程式碼,新增 /login 頁面
from django.contrib.auth import views as auth_views
url(r'^en/login/$', auth_views.login, {'template_name': 'registration/login.html'})
login 這個頁面就會使用放在 registration 資料夾裡面的 login.html 當作 template。
以下是我們的 login.html
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<div class="login-page">
<div class="form">
<form method="POST" class="login-form">
{% csrf_token %}
<input type="text" name="username" placeholder="username"/>
<input type="password" name="password" placeholder="password"/>
<button type="submit">login</button>
<p class="message">Not registered? <a href="/register/">Create an account</a></p>
</form>
</div>
</div>
</body>
<style>@import url(https://fonts.googleapis.com/css?family=Roboto:300);
.login-page {
width: 360px;
padding: 8% 0 0;
margin: auto;
}
.form {
position: relative;
z-index: 1;
background: #FFFFFF;
max-width: 360px;
margin: 0 auto 100px;
padding: 45px;
text-align: center;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
}
.form input {
font-family: "Roboto", sans-serif;
outline: 0;
background: #f2f2f2;
width: 100%;
border: 0;
margin: 0 0 15px;
padding: 15px;
box-sizing: border-box;
font-size: 14px;
}
.form button {
font-family: "Roboto", sans-serif;
text-transform: uppercase;
outline: 0;
background: #4CAF50;
width: 100%;
border: 0;
padding: 15px;
color: #FFFFFF;
font-size: 14px;
-webkit-transition: all 0.3 ease;
transition: all 0.3 ease;
cursor: pointer;
}
.form button:hover,.form button:active,.form button:focus {
background: #43A047;
}
.form .message {
margin: 15px 0 0;
color: #b3b3b3;
font-size: 12px;
}
.form .message a {
color: #4CAF50;
text-decoration: none;
}
.form .register-form {
display: none;
}
.container {
position: relative;
z-index: 1;
max-width: 300px;
margin: 0 auto;
}
.container:before, .container:after {
content: "";
display: block;
clear: both;
}
.container .info {
margin: 50px auto;
text-align: center;
}
.container .info h1 {
margin: 0 0 15px;
padding: 0;
font-size: 36px;
font-weight: 300;
color: #1a1a1a;
}
.container .info span {
color: #4d4d4d;
font-size: 12px;
}
.container .info span a {
color: #000000;
text-decoration: none;
}
.container .info span .fa {
color: #EF3B3A;
}
body {
background: #76b852; /* fallback for old browsers */
background: -webkit-linear-gradient(right, #76b852, #8DC26F);
background: -moz-linear-gradient(right, #76b852, #8DC26F);
background: -o-linear-gradient(right, #76b852, #8DC26F);
background: linear-gradient(to left, #76b852, #8DC26F);
font-family: "Roboto", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}</style>
</html>
在 settings.py 中指定登入後的導頁:
LOGIN_REDIRECT_URL = '/'
新增 logout,在 urls.py 新增:
url(r'^logout/$', auth_views.logout)
並且新增 registration/logged_out.html 檔案:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
You have successfully logged out.
<a href="/">Home</a>
</body>
</html>
接下來,為了註冊,在 mysite/urls.py 新增 url:
from django.conf.urls import url, include
from django.contrib import admin
from .views import home, register
urlpatterns = [
url(r'^register/', register),
]
因為使用了 django register 的 view,所以建一個資料 django_login,底下新增 forms.py 檔案,檔案內容如下:
from django import forms
class UserRegistrationForm(forms.Form):
username = forms.CharField(
required = True,
label = 'Username',
max_length = 32
)
email = forms.CharField(
required = True,
label = 'Email',
max_length = 32,
)
password = forms.CharField(
required = True,
label = 'Password',
max_length = 32,
widget = forms.PasswordInput()
)
在新增 django_login/view.py,才可以讓使用者填入資料
from django.shortcuts import render
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect
from django import forms
from .forms import UserRegistrationForm
# Create your views here.
def register(request):
if request.method == 'POST':
form = UserRegistrationForm(request.POST)
if form.is_valid():
userObj = form.cleaned_data
username = userObj['username']
email = userObj['email']
password = userObj['password']
if not (User.objects.filter(username=username).exists() or User.objects.filter(email=email).exists()):
User.objects.create_user(username, email, password)
user = authenticate(username = username, password = password)
login(request, user)
return HttpResponseRedirect('/')
else:
raise forms.ValidationError('Looks like a username with that email or password already exists')
else:
form = UserRegistrationForm()
return render(request, 'django_login/register.html', {'form' : form})
在這個 view 之中,我們判斷 request 是不是 POST,並且建立了 UserRegistrationForm 的表單。
接下來我們還要新增 djnago_login/register.html,內容如下:
<!DOCTYPE html>
<html>
<head>
<title>Login</title>
</head>
<body>
<div class="login-page">
<div class="form">
<form method="POST" class="register-form">
{% csrf_token %} {{ form.as_p }}
<button>create</button>
<p class="message">Already registered? <a href="/login/">Sign In</a></p>
</form>
</div>
</div>
</body>
<style>@import url(https://fonts.googleapis.com/css?family=Roboto:300);
.login-page {
width: 360px;
padding: 8% 0 0;
margin: auto;
}
.form {
position: relative;
z-index: 1;
background: #FFFFFF;
max-width: 360px;
margin: 0 auto 100px;
padding: 45px;
text-align: center;
box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
}
.form input {
font-family: "Roboto", sans-serif;
outline: 0;
background: #f2f2f2;
width: 100%;
border: 0;
margin: 0 0 15px;
padding: 15px;
box-sizing: border-box;
font-size: 14px;
}
.form button {
font-family: "Roboto", sans-serif;
text-transform: uppercase;
outline: 0;
background: #4CAF50;
width: 100%;
border: 0;
padding: 15px;
color: #FFFFFF;
font-size: 14px;
-webkit-transition: all 0.3 ease;
transition: all 0.3 ease;
cursor: pointer;
}
.form button:hover,.form button:active,.form button:focus {
background: #43A047;
}
.form .message {
margin: 15px 0 0;
color: #b3b3b3;
font-size: 12px;
}
.form .message a {
color: #4CAF50;
text-decoration: none;
}
.form .register-form {
display: true;
}
.container {
position: relative;
z-index: 1;
max-width: 300px;
margin: 0 auto;
}
.container:before, .container:after {
content: "";
display: block;
clear: both;
}
.container .info {
margin: 50px auto;
text-align: center;
}
.container .info h1 {
margin: 0 0 15px;
padding: 0;
font-size: 36px;
font-weight: 300;
color: #1a1a1a;
}
.container .info span {
color: #4d4d4d;
font-size: 12px;
}
.container .info span a {
color: #000000;
text-decoration: none;
}
.container .info span .fa {
color: #EF3B3A;
}
body {
background: #76b852; /* fallback for old browsers */
background: -webkit-linear-gradient(right, #76b852, #8DC26F);
background: -moz-linear-gradient(right, #76b852, #8DC26F);
background: -o-linear-gradient(right, #76b852, #8DC26F);
background: linear-gradient(to left, #76b852, #8DC26F);
font-family: "Roboto", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}</style>
<script>
$('.message a').click(function(){
$('form').animate({height: "toggle", opacity: "toggle"}, "slow");
});
</script>
</html>
現在,我們必須使用 CMSApp 讓 CMS 知道如何管理,
在 django_login 的目錄下新增 cms_app.py:
from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _
class django_login(CMSApp):
app_name = "django_login"
name = _("LOGIN")
def get_urls(self, page=None, language=None, **kwargs):
return ["django_login.urls"]
apphook_pool.register(django_login) # register the application
這樣就完成了!你可去看看。
注意,頁面需要 publish 才會有效 可以到這裡獲得完整範例
點擊立即下載此篇文章 PDF
稍後下載閱讀,或與好友分享
留言
PoftWoste@mailport.lat
Osmolality in serum and urine was not formally measured, and it was calculated using a standard formula; only 17 patients had urinary nitrogen determinations <a href=https://enhanceyourlife.mom/>can i buy priligy over the counter</a>