Skip to content

Commit 5a46d59

Browse files
committed
'更新了Django示例代码'
1 parent dd4e41f commit 5a46d59

File tree

15 files changed

+187
-46
lines changed

15 files changed

+187
-46
lines changed

Day41-55/code/hellodjango/demo/admin.py

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from django.contrib import admin
22

3-
from demo.models import Teacher, Subject
3+
from demo.models import Teacher, Subject, User
4+
5+
6+
class UserAdmin(admin.ModelAdmin):
7+
list_display = ('no', 'username', 'email', 'counter')
8+
ordering = ('no', )
49

510

611
class SubjectAdmin(admin.ModelAdmin):
@@ -16,4 +21,5 @@ class TeacherAdmin(admin.ModelAdmin):
1621

1722
admin.site.register(Subject, SubjectAdmin)
1823
admin.site.register(Teacher, TeacherAdmin)
24+
admin.site.register(User, UserAdmin)
1925

Day41-55/code/hellodjango/demo/apps.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
class DemoConfig(AppConfig):
5-
name = 'demo'
5+
name = '投票'

Day41-55/code/hellodjango/demo/forms.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55

66
class UserForm(forms.ModelForm):
7-
username = forms.CharField(widget=forms.TextInput, min_length=6, max_length=20, help_text='请输入用户名')
8-
password = forms.CharField(widget=forms.PasswordInput, min_length=8, max_length=20, help_text='请输入密码')
9-
email = forms.CharField(widget=forms.EmailInput, max_length=255, help_text='请输入邮箱')
7+
username = forms.CharField(widget=forms.TextInput, min_length=6, max_length=20)
8+
password = forms.CharField(widget=forms.PasswordInput, min_length=8, max_length=20)
9+
email = forms.CharField(widget=forms.EmailInput, max_length=255)
1010

1111
class Meta(object):
1212
model = User
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 序列化 - 把对象写入数据流 - 串行化 / 归档 / 腌咸菜
2+
# 反序列化 - 从数据流中恢复出对象 - 反串行化 / 解归档
3+
# Python有三个支持序列化的模块
4+
# json - JSON / pickle - 二进制 / shelve
5+
import json
6+
import pickle
7+
8+
9+
class Student(object):
10+
11+
def __init__(self, name, age):
12+
self.name = name
13+
self.age = age
14+
15+
16+
if __name__ == '__main__':
17+
list1 = [10, 'hello', 99.9, 'goodbye']
18+
print(json.dumps(list1))
19+
print(pickle.dumps(list1))
20+
dict1 = {'name': '骆昊', 'age': 38}
21+
print(json.dumps(dict1))
22+
print(pickle.dumps(dict1))
23+
stu = Student('骆昊', 38)
24+
print(pickle.dumps(stu))
25+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Generated by Django 2.0.6 on 2018-07-06 06:58
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('demo', '0004_auto_20180705_1017'),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name='teacher',
15+
options={'ordering': ('no',), 'verbose_name': '讲师', 'verbose_name_plural': '讲师'},
16+
),
17+
migrations.AddField(
18+
model_name='user',
19+
name='counter',
20+
field=models.IntegerField(default=3, verbose_name='票数'),
21+
),
22+
]

Day41-55/code/hellodjango/demo/models.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@
33
from django.db import models
44
from django.db.models import PROTECT
55

6-
# 高内聚 低耦合
7-
# 面向对象七个设计原则
8-
# 单一职责原则 / 开闭原则 / 依赖倒转原则 / 里氏替换原则 / 接口隔离原则 / 合成聚合复用原则 / 迪米特法则
9-
# 1995年 - GoF - 23个设计模式
10-
# 创建型模式中的原型模式
116
proto = sha1()
127

138

@@ -16,6 +11,7 @@ class User(models.Model):
1611
username = models.CharField(max_length=20, unique=True, verbose_name='用户名')
1712
password = models.CharField(max_length=40, verbose_name='口令')
1813
email = models.CharField(max_length=255, verbose_name='邮箱')
14+
counter = models.IntegerField(default=3, verbose_name='票数')
1915

2016
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
2117
hasher = proto.copy()
@@ -68,4 +64,4 @@ class Meta(object):
6864
db_table = 'tb_teacher'
6965
verbose_name = '讲师'
7066
verbose_name_plural = '讲师'
71-
ordering = ('name', )
67+
ordering = ('no', )

Day41-55/code/hellodjango/demo/views.py

+51-16
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ def login(request):
1818
hasher = proto.copy()
1919
hasher.update(password.encode('utf-8'))
2020
if hasher.hexdigest() == user.password:
21+
request.session['user'] = user
2122
return redirect('sub')
2223
except User.DoesNotExist:
2324
pass
2425
return render(request, 'demo/login.html',
2526
{'hint': '用户名或密码错误'})
2627

2728

28-
2929
def register(request):
3030
form = UserForm()
3131
if request.method.lower() == 'get':
@@ -44,29 +44,64 @@ def register(request):
4444
return render(request, 'demo/register.html', ctx)
4545

4646

47+
def check_username(request):
48+
ctx = {}
49+
if 'username' in request.GET:
50+
username = request.GET['username']
51+
try:
52+
User.objects.get(username__exact=username)
53+
ctx['valid'] = False
54+
except User.DoesNotExist:
55+
ctx['valid'] = True
56+
return HttpResponse(json.dumps(ctx),
57+
content_type='application/json; charset=utf-8')
58+
59+
4760
def show_subjects(request):
48-
ctx = {'subjects_list': Subject.objects.all()}
49-
return render(request, 'demo/subject.html', ctx)
61+
if 'user' in request.session and request.session['user']:
62+
ctx = {'subjects_list': Subject.objects.all()}
63+
return render(request, 'demo/subject.html', ctx)
64+
else:
65+
return render(request, 'demo/login.html',
66+
{'hint': '请先登录!'})
5067

5168

5269
def show_teachers(request, no):
53-
teachers = Teacher.objects.filter(subject__no=no)
54-
ctx = {'teachers_list': teachers}
55-
return render(request, 'demo/teacher.html', ctx)
70+
if 'user' in request.session and request.session['user']:
71+
teachers = Teacher.objects.filter(subject__no=no)\
72+
.select_related('subject')
73+
ctx = {'teachers_list': teachers}
74+
return render(request, 'demo/teacher.html', ctx)
75+
else:
76+
return render(request, 'demo/login.html',
77+
{'hint': '请先登录!'})
5678

5779

5880
def make_comment(request, no):
5981
ctx = {'code': 200}
60-
try:
61-
teacher = Teacher.objects.get(pk=no)
62-
if request.path.startswith('/good'):
63-
teacher.good_count += 1
64-
ctx['result'] = f'好评({teacher.gcount})'
82+
if 'user' in request.session and request.session['user']:
83+
user = request.session['user']
84+
if user.counter > 0:
85+
try:
86+
teacher = Teacher.objects.get(pk=no)
87+
if request.path.startswith('/good'):
88+
teacher.good_count += 1
89+
ctx['result'] = f'好评({teacher.gcount})'
90+
else:
91+
teacher.bad_count += 1
92+
ctx['result'] = f'差评({teacher.bcount})'
93+
teacher.save()
94+
user.counter -= 1
95+
User.objects.filter(username__exact=user.username)\
96+
.update(counter=user.counter)
97+
request.session['user'] = user
98+
except Teacher.DoesNotExist:
99+
ctx['code'] = 404
65100
else:
66-
teacher.bad_count += 1
67-
ctx['result'] = f'差评({teacher.bcount})'
68-
teacher.save()
69-
except Teacher.DoesNotExist:
70-
ctx['code'] = 404
101+
ctx['code'] = 403
102+
ctx['result'] = '票数不足'
103+
else:
104+
ctx['code'] = 302
105+
ctx['result'] = '请先登录'
71106
return HttpResponse(json.dumps(ctx),
72107
content_type='application/json; charset=utf-8')

Day41-55/code/hellodjango/hellodjango/settings.py

+20-4
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@
2727

2828
ALLOWED_HOSTS = []
2929

30+
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
31+
SESSION_COOKIE_AGE = 1800
3032

3133
# Application definition
32-
3334
INSTALLED_APPS = [
3435
'django.contrib.admin',
3536
'django.contrib.auth',
@@ -73,7 +74,6 @@
7374

7475
# Database
7576
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
76-
7777
DATABASES = {
7878
'default': {
7979
'ENGINE': 'django.db.backends.mysql',
@@ -88,7 +88,6 @@
8888

8989
# Password validation
9090
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
91-
9291
AUTH_PASSWORD_VALIDATORS = [
9392
{
9493
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
@@ -107,7 +106,6 @@
107106

108107
# Internationalization
109108
# https://docs.djangoproject.com/en/2.0/topics/i18n/
110-
111109
LANGUAGE_CODE = 'zh-hans'
112110

113111
TIME_ZONE = 'Asia/Chongqing'
@@ -120,10 +118,28 @@
120118

121119
USE_TZ = True
122120

121+
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
123122

124123
# Static files (CSS, JavaScript, Images)
125124
# https://docs.djangoproject.com/en/2.0/howto/static-files/
126125
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
127126
STATIC_URL = '/static/'
128127

129128
# APPEND_SLASH = False
129+
130+
# DEBUG < INFO < WARNING < ERROR < CRITICAL
131+
LOGGING = {
132+
'version': 1,
133+
'disable_existing_loggers': False,
134+
'handlers': {
135+
'console': {
136+
'class': 'logging.StreamHandler',
137+
},
138+
},
139+
'loggers': {
140+
'django': {
141+
'handlers': ['console'],
142+
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
143+
},
144+
},
145+
}

Day41-55/code/hellodjango/hellodjango/urls.py

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
path('', views.login),
2323
path('login/', views.login),
2424
path('register/', views.register),
25+
path('check/', views.check_username),
2526
path('subjects/', views.show_subjects, name='sub'),
2627
path('subjects/<int:no>/', views.show_teachers),
2728
path('good/<int:no>/', views.make_comment),
Loading
Loading

Day41-55/code/hellodjango/templates/demo/login.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<title>用户登录</title>
66
<style>
77
#login {
8-
width: 250px;
8+
width: 320px;
99
margin: 20px auto;
1010
}
1111
#login form div {

Day41-55/code/hellodjango/templates/demo/register.html

+29-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
<!doctype html>
2+
{% load staticfiles %}
23
<html lang="en">
34
<head>
45
<meta charset="UTF-8">
56
<title>用户注册</title>
67
<style>
78
#reg {
8-
width: 320px;
9+
width: 350px;
910
margin: 20px auto;
1011
}
1112
#reg form div {
@@ -24,11 +25,12 @@ <h1>用户注册</h1>
2425
<p class="hint">{{ hint }}</p>
2526
<form action="/register/" method="post">
2627
{% csrf_token %}
27-
<div>用户名: </div>
28+
<div>用户名:</div>
2829
<div>
2930
{{ f.username }}
31+
<span id="uhint"></span>
3032
{% if f.errors.username %}
31-
<span class="hint">用户已被注册</span>
33+
<span class="hint">用户名无效或者已经被注册</span>
3234
{% endif %}
3335
</div>
3436
<div>密码: </div>
@@ -45,11 +47,32 @@ <h1>用户注册</h1>
4547
<span class="hint">无效的邮箱</span>
4648
{% endif %}
4749
</div>
48-
<div>
49-
<input type="submit" value="注册">
50-
</div>
50+
<input type="submit" value="注册">
5151
</form>
5252
<a href="/">返回登录</a>
5353
</div>
54+
<script src="{% static 'js/jquery.min.js' %}"></script>
55+
<script>
56+
$(function() {
57+
$('#id_username').on('blur', function (evt) {
58+
var $input = $(evt.target);
59+
$.ajax({
60+
'url': '/check/',
61+
'type': 'get',
62+
'data': {'username': $input.val()},
63+
'dataType': 'json',
64+
'success': function(json) {
65+
var $img = $('<img>');
66+
if (json.valid) {
67+
$img.attr('src', '/static/images/icon-yes.svg');
68+
} else {
69+
$img.attr('src', '/static/images/icon-no.svg');
70+
}
71+
$('#uhint').empty().append($img);
72+
}
73+
});
74+
});
75+
});
76+
</script>
5477
</body>
5578
</html>

Day41-55/code/hellodjango/templates/demo/subject.html

+15-7
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,24 @@
33
<head>
44
<meta charset="UTF-8">
55
<title>学科信息</title>
6+
<style>
7+
body {
8+
width: 960px;
9+
margin: 0 auto;
10+
}
11+
.sub {
12+
margin: 20px 10px;
13+
}
14+
</style>
615
</head>
716
<body>
817
<h1>学科信息</h1>
918
<hr>
10-
<ul>
11-
{% for subject in subjects_list %}
12-
<li>
13-
<a href="/subjects/{{ subject.no }}">{{ subject.name }}</a>
14-
</li>
15-
{% endfor %}
16-
</ul>
19+
{% for subject in subjects_list %}
20+
<dl class="sub">
21+
<dt><a href="/subjects/{{ subject.no }}">{{ subject.name }}</a></dt>
22+
<dd>{{ subject.intro }}</dd>
23+
</dl>
24+
{% endfor %}
1725
</body>
1826
</html>

0 commit comments

Comments
 (0)