Commit 5a46d599 authored by jackfrued's avatar jackfrued

'更新了Django示例代码'

parent dd4e41fe
from django.contrib import admin from django.contrib import admin
from demo.models import Teacher, Subject from demo.models import Teacher, Subject, User
class UserAdmin(admin.ModelAdmin):
list_display = ('no', 'username', 'email', 'counter')
ordering = ('no', )
class SubjectAdmin(admin.ModelAdmin): class SubjectAdmin(admin.ModelAdmin):
...@@ -16,4 +21,5 @@ class TeacherAdmin(admin.ModelAdmin): ...@@ -16,4 +21,5 @@ class TeacherAdmin(admin.ModelAdmin):
admin.site.register(Subject, SubjectAdmin) admin.site.register(Subject, SubjectAdmin)
admin.site.register(Teacher, TeacherAdmin) admin.site.register(Teacher, TeacherAdmin)
admin.site.register(User, UserAdmin)
...@@ -2,4 +2,4 @@ from django.apps import AppConfig ...@@ -2,4 +2,4 @@ from django.apps import AppConfig
class DemoConfig(AppConfig): class DemoConfig(AppConfig):
name = 'demo' name = '投票'
...@@ -4,9 +4,9 @@ from demo.models import User ...@@ -4,9 +4,9 @@ from demo.models import User
class UserForm(forms.ModelForm): class UserForm(forms.ModelForm):
username = forms.CharField(widget=forms.TextInput, min_length=6, max_length=20, help_text='请输入用户名') username = forms.CharField(widget=forms.TextInput, min_length=6, max_length=20)
password = forms.CharField(widget=forms.PasswordInput, min_length=8, max_length=20, help_text='请输入密码') password = forms.CharField(widget=forms.PasswordInput, min_length=8, max_length=20)
email = forms.CharField(widget=forms.EmailInput, max_length=255, help_text='请输入邮箱') email = forms.CharField(widget=forms.EmailInput, max_length=255)
class Meta(object): class Meta(object):
model = User model = User
......
# 序列化 - 把对象写入数据流 - 串行化 / 归档 / 腌咸菜
# 反序列化 - 从数据流中恢复出对象 - 反串行化 / 解归档
# Python有三个支持序列化的模块
# json - JSON / pickle - 二进制 / shelve
import json
import pickle
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
if __name__ == '__main__':
list1 = [10, 'hello', 99.9, 'goodbye']
print(json.dumps(list1))
print(pickle.dumps(list1))
dict1 = {'name': '骆昊', 'age': 38}
print(json.dumps(dict1))
print(pickle.dumps(dict1))
stu = Student('骆昊', 38)
print(pickle.dumps(stu))
# Generated by Django 2.0.6 on 2018-07-06 06:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('demo', '0004_auto_20180705_1017'),
]
operations = [
migrations.AlterModelOptions(
name='teacher',
options={'ordering': ('no',), 'verbose_name': '讲师', 'verbose_name_plural': '讲师'},
),
migrations.AddField(
model_name='user',
name='counter',
field=models.IntegerField(default=3, verbose_name='票数'),
),
]
...@@ -3,11 +3,6 @@ from hashlib import sha1 ...@@ -3,11 +3,6 @@ from hashlib import sha1
from django.db import models from django.db import models
from django.db.models import PROTECT from django.db.models import PROTECT
# 高内聚 低耦合
# 面向对象七个设计原则
# 单一职责原则 / 开闭原则 / 依赖倒转原则 / 里氏替换原则 / 接口隔离原则 / 合成聚合复用原则 / 迪米特法则
# 1995年 - GoF - 23个设计模式
# 创建型模式中的原型模式
proto = sha1() proto = sha1()
...@@ -16,6 +11,7 @@ class User(models.Model): ...@@ -16,6 +11,7 @@ class User(models.Model):
username = models.CharField(max_length=20, unique=True, verbose_name='用户名') username = models.CharField(max_length=20, unique=True, verbose_name='用户名')
password = models.CharField(max_length=40, verbose_name='口令') password = models.CharField(max_length=40, verbose_name='口令')
email = models.CharField(max_length=255, verbose_name='邮箱') email = models.CharField(max_length=255, verbose_name='邮箱')
counter = models.IntegerField(default=3, verbose_name='票数')
def save(self, force_insert=False, force_update=False, using=None, update_fields=None): def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
hasher = proto.copy() hasher = proto.copy()
...@@ -68,4 +64,4 @@ class Teacher(models.Model): ...@@ -68,4 +64,4 @@ class Teacher(models.Model):
db_table = 'tb_teacher' db_table = 'tb_teacher'
verbose_name = '讲师' verbose_name = '讲师'
verbose_name_plural = '讲师' verbose_name_plural = '讲师'
ordering = ('name', ) ordering = ('no', )
...@@ -18,6 +18,7 @@ def login(request): ...@@ -18,6 +18,7 @@ def login(request):
hasher = proto.copy() hasher = proto.copy()
hasher.update(password.encode('utf-8')) hasher.update(password.encode('utf-8'))
if hasher.hexdigest() == user.password: if hasher.hexdigest() == user.password:
request.session['user'] = user
return redirect('sub') return redirect('sub')
except User.DoesNotExist: except User.DoesNotExist:
pass pass
...@@ -25,7 +26,6 @@ def login(request): ...@@ -25,7 +26,6 @@ def login(request):
{'hint': '用户名或密码错误'}) {'hint': '用户名或密码错误'})
def register(request): def register(request):
form = UserForm() form = UserForm()
if request.method.lower() == 'get': if request.method.lower() == 'get':
...@@ -44,19 +44,44 @@ def register(request): ...@@ -44,19 +44,44 @@ def register(request):
return render(request, 'demo/register.html', ctx) return render(request, 'demo/register.html', ctx)
def check_username(request):
ctx = {}
if 'username' in request.GET:
username = request.GET['username']
try:
User.objects.get(username__exact=username)
ctx['valid'] = False
except User.DoesNotExist:
ctx['valid'] = True
return HttpResponse(json.dumps(ctx),
content_type='application/json; charset=utf-8')
def show_subjects(request): def show_subjects(request):
if 'user' in request.session and request.session['user']:
ctx = {'subjects_list': Subject.objects.all()} ctx = {'subjects_list': Subject.objects.all()}
return render(request, 'demo/subject.html', ctx) return render(request, 'demo/subject.html', ctx)
else:
return render(request, 'demo/login.html',
{'hint': '请先登录!'})
def show_teachers(request, no): def show_teachers(request, no):
teachers = Teacher.objects.filter(subject__no=no) if 'user' in request.session and request.session['user']:
teachers = Teacher.objects.filter(subject__no=no)\
.select_related('subject')
ctx = {'teachers_list': teachers} ctx = {'teachers_list': teachers}
return render(request, 'demo/teacher.html', ctx) return render(request, 'demo/teacher.html', ctx)
else:
return render(request, 'demo/login.html',
{'hint': '请先登录!'})
def make_comment(request, no): def make_comment(request, no):
ctx = {'code': 200} ctx = {'code': 200}
if 'user' in request.session and request.session['user']:
user = request.session['user']
if user.counter > 0:
try: try:
teacher = Teacher.objects.get(pk=no) teacher = Teacher.objects.get(pk=no)
if request.path.startswith('/good'): if request.path.startswith('/good'):
...@@ -66,7 +91,17 @@ def make_comment(request, no): ...@@ -66,7 +91,17 @@ def make_comment(request, no):
teacher.bad_count += 1 teacher.bad_count += 1
ctx['result'] = f'差评({teacher.bcount})' ctx['result'] = f'差评({teacher.bcount})'
teacher.save() teacher.save()
user.counter -= 1
User.objects.filter(username__exact=user.username)\
.update(counter=user.counter)
request.session['user'] = user
except Teacher.DoesNotExist: except Teacher.DoesNotExist:
ctx['code'] = 404 ctx['code'] = 404
else:
ctx['code'] = 403
ctx['result'] = '票数不足'
else:
ctx['code'] = 302
ctx['result'] = '请先登录'
return HttpResponse(json.dumps(ctx), return HttpResponse(json.dumps(ctx),
content_type='application/json; charset=utf-8') content_type='application/json; charset=utf-8')
...@@ -27,9 +27,10 @@ DEBUG = True ...@@ -27,9 +27,10 @@ DEBUG = True
ALLOWED_HOSTS = [] ALLOWED_HOSTS = []
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_COOKIE_AGE = 1800
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
...@@ -73,7 +74,6 @@ WSGI_APPLICATION = 'hellodjango.wsgi.application' ...@@ -73,7 +74,6 @@ WSGI_APPLICATION = 'hellodjango.wsgi.application'
# Database # Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases # https://docs.djangoproject.com/en/2.0/ref/settings/#databases
DATABASES = { DATABASES = {
'default': { 'default': {
'ENGINE': 'django.db.backends.mysql', 'ENGINE': 'django.db.backends.mysql',
...@@ -88,7 +88,6 @@ DATABASES = { ...@@ -88,7 +88,6 @@ DATABASES = {
# Password validation # Password validation
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [ AUTH_PASSWORD_VALIDATORS = [
{ {
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
...@@ -107,7 +106,6 @@ AUTH_PASSWORD_VALIDATORS = [ ...@@ -107,7 +106,6 @@ AUTH_PASSWORD_VALIDATORS = [
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/2.0/topics/i18n/ # https://docs.djangoproject.com/en/2.0/topics/i18n/
LANGUAGE_CODE = 'zh-hans' LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Chongqing' TIME_ZONE = 'Asia/Chongqing'
...@@ -120,6 +118,7 @@ USE_L10N = True ...@@ -120,6 +118,7 @@ USE_L10N = True
USE_TZ = True USE_TZ = True
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.0/howto/static-files/ # https://docs.djangoproject.com/en/2.0/howto/static-files/
...@@ -127,3 +126,20 @@ STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),] ...@@ -127,3 +126,20 @@ STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
STATIC_URL = '/static/' STATIC_URL = '/static/'
# APPEND_SLASH = False # APPEND_SLASH = False
# DEBUG < INFO < WARNING < ERROR < CRITICAL
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
},
},
}
...@@ -22,6 +22,7 @@ urlpatterns = [ ...@@ -22,6 +22,7 @@ urlpatterns = [
path('', views.login), path('', views.login),
path('login/', views.login), path('login/', views.login),
path('register/', views.register), path('register/', views.register),
path('check/', views.check_username),
path('subjects/', views.show_subjects, name='sub'), path('subjects/', views.show_subjects, name='sub'),
path('subjects/<int:no>/', views.show_teachers), path('subjects/<int:no>/', views.show_teachers),
path('good/<int:no>/', views.make_comment), path('good/<int:no>/', views.make_comment),
......
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#dd4646" d="M1277 1122q0-26-19-45l-181-181 181-181q19-19 19-45 0-27-19-46l-90-90q-19-19-46-19-26 0-45 19l-181 181-181-181q-19-19-45-19-27 0-46 19l-90 90q-19 19-19 46 0 26 19 45l181 181-181 181q-19 19-19 45 0 27 19 46l90 90q19 19 46 19 26 0 45-19l181-181 181 181q19 19 45 19 27 0 46-19l90-90q19-19 19-46zm387-226q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</svg>
<svg width="13" height="13" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg">
<path fill="#70bf2b" d="M1412 734q0-28-18-46l-91-90q-19-19-45-19t-45 19l-408 407-226-226q-19-19-45-19t-45 19l-91 90q-18 18-18 46 0 27 18 45l362 362q19 19 45 19 27 0 46-19l543-543q18-18 18-45zm252 162q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/>
</svg>
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<title>用户登录</title> <title>用户登录</title>
<style> <style>
#login { #login {
width: 250px; width: 320px;
margin: 20px auto; margin: 20px auto;
} }
#login form div { #login form div {
......
<!doctype html> <!doctype html>
{% load staticfiles %}
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>用户注册</title> <title>用户注册</title>
<style> <style>
#reg { #reg {
width: 320px; width: 350px;
margin: 20px auto; margin: 20px auto;
} }
#reg form div { #reg form div {
...@@ -24,11 +25,12 @@ ...@@ -24,11 +25,12 @@
<p class="hint">{{ hint }}</p> <p class="hint">{{ hint }}</p>
<form action="/register/" method="post"> <form action="/register/" method="post">
{% csrf_token %} {% csrf_token %}
<div>用户名: </div> <div>用户名:</div>
<div> <div>
{{ f.username }} {{ f.username }}
<span id="uhint"></span>
{% if f.errors.username %} {% if f.errors.username %}
<span class="hint">用户被注册</span> <span class="hint">用户名无效或者已经被注册</span>
{% endif %} {% endif %}
</div> </div>
<div>密码: </div> <div>密码: </div>
...@@ -45,11 +47,32 @@ ...@@ -45,11 +47,32 @@
<span class="hint">无效的邮箱</span> <span class="hint">无效的邮箱</span>
{% endif %} {% endif %}
</div> </div>
<div>
<input type="submit" value="注册"> <input type="submit" value="注册">
</div>
</form> </form>
<a href="/">返回登录</a> <a href="/">返回登录</a>
</div> </div>
<script src="{% static 'js/jquery.min.js' %}"></script>
<script>
$(function() {
$('#id_username').on('blur', function (evt) {
var $input = $(evt.target);
$.ajax({
'url': '/check/',
'type': 'get',
'data': {'username': $input.val()},
'dataType': 'json',
'success': function(json) {
var $img = $('<img>');
if (json.valid) {
$img.attr('src', '/static/images/icon-yes.svg');
} else {
$img.attr('src', '/static/images/icon-no.svg');
}
$('#uhint').empty().append($img);
}
});
});
});
</script>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -3,16 +3,24 @@ ...@@ -3,16 +3,24 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<title>学科信息</title> <title>学科信息</title>
<style>
body {
width: 960px;
margin: 0 auto;
}
.sub {
margin: 20px 10px;
}
</style>
</head> </head>
<body> <body>
<h1>学科信息</h1> <h1>学科信息</h1>
<hr> <hr>
<ul>
{% for subject in subjects_list %} {% for subject in subjects_list %}
<li> <dl class="sub">
<a href="/subjects/{{ subject.no }}">{{ subject.name }}</a> <dt><a href="/subjects/{{ subject.no }}">{{ subject.name }}</a></dt>
</li> <dd>{{ subject.intro }}</dd>
</dl>
{% endfor %} {% endfor %}
</ul>
</body> </body>
</html> </html>
\ No newline at end of file
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
.potrait { .potrait {
width: 40%; width: 40%;
float: left; float: left;
text-align: right;
} }
hr { hr {
clear: both; clear: both;
...@@ -37,7 +38,7 @@ ...@@ -37,7 +38,7 @@
{% for x in teachers_list %} {% for x in teachers_list %}
<div class="container"> <div class="container">
<div class="basic"> <div class="basic">
<h1>{{ x.name }}老师</h1> <h1>{{ x.name }}老师 - {{ x.subject.name }}</h1>
<p><strong>讲师简介</strong></p> <p><strong>讲师简介</strong></p>
<p>{{ x.intro }}</p> <p>{{ x.intro }}</p>
<p><strong>教学理念</strong></p> <p><strong>教学理念</strong></p>
...@@ -68,6 +69,8 @@ ...@@ -68,6 +69,8 @@
'success': function(json) { 'success': function(json) {
if (json.code == 200) { if (json.code == 200) {
$a.text(json.result); $a.text(json.result);
} else if (json.code == 403) {
alert(json.result);
} }
}, },
'error': function() {} 'error': function() {}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment