Skip to content

Commit 267bd52

Browse files
committed
'更新了Django示例代码'
1 parent 24422f4 commit 267bd52

File tree

10 files changed

+251
-38
lines changed

10 files changed

+251
-38
lines changed

Diff for: Day41-55/code/hellodjango/demo/forms.py

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from django import forms
2+
3+
from demo.models import User
4+
5+
6+
class UserForm(forms.ModelForm):
7+
username = forms.CharField(max_length=20, min_length=6)
8+
password = forms.CharField(widget=forms.PasswordInput, max_length=20, min_length=8)
9+
email = forms.CharField(widget=forms.EmailInput, max_length=255)
10+
11+
class Meta(object):
12+
model = User
13+
fields = ('username', 'password', 'email')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 2.0.6 on 2018-07-05 02:17
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('demo', '0003_auto_20180704_1118'),
11+
]
12+
13+
operations = [
14+
migrations.CreateModel(
15+
name='User',
16+
fields=[
17+
('no', models.AutoField(db_column='uno', primary_key=True, serialize=False, verbose_name='编号')),
18+
('username', models.CharField(max_length=20, unique=True, verbose_name='用户名')),
19+
('password', models.CharField(max_length=40, verbose_name='口令')),
20+
('email', models.CharField(max_length=255, verbose_name='邮箱')),
21+
],
22+
options={
23+
'verbose_name': '用户',
24+
'verbose_name_plural': '用户',
25+
'db_table': 'tb_user',
26+
},
27+
),
28+
migrations.AlterField(
29+
model_name='teacher',
30+
name='subject',
31+
field=models.ForeignKey(db_column='sno', on_delete=django.db.models.deletion.PROTECT, related_name='+', to='demo.Subject', verbose_name='所属学科'),
32+
),
33+
]

Diff for: Day41-55/code/hellodjango/demo/models.py

+37
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
1+
from hashlib import sha1
2+
13
from django.db import models
24
from django.db.models import PROTECT
35

6+
# 高内聚 低耦合
7+
# 面向对象七个设计原则
8+
# 单一职责原则 / 开闭原则 / 依赖倒转原则 / 里氏替换原则 / 接口隔离原则 / 合成聚合复用原则 / 迪米特法则
9+
# 1995年 - GoF - 23个设计模式
10+
# 创建型模式中的原型模式
11+
proto = sha1()
12+
13+
14+
class User(models.Model):
15+
no = models.AutoField(primary_key=True, db_column='uno', verbose_name='编号')
16+
username = models.CharField(max_length=20, unique=True, verbose_name='用户名')
17+
password = models.CharField(max_length=40, verbose_name='口令')
18+
email = models.CharField(max_length=255, verbose_name='邮箱')
19+
20+
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
21+
hasher = proto.copy()
22+
hasher.update(self.password.encode('utf-8'))
23+
self.password = hasher.hexdigest()
24+
super().save(force_insert, force_update, using, update_fields)
25+
26+
class Meta(object):
27+
db_table = 'tb_user'
28+
verbose_name = '用户'
29+
verbose_name_plural = '用户'
30+
431

532
class Subject(models.Model):
633
no = models.AutoField(primary_key=True, db_column='sno', verbose_name='编号')
@@ -27,6 +54,16 @@ class Teacher(models.Model):
2754
good_count = models.IntegerField(default=0, db_column='tgcount', verbose_name='好评数')
2855
bad_count = models.IntegerField(default=0, db_column='tbcount', verbose_name='差评数')
2956

57+
@property
58+
def gcount(self):
59+
return f'{self.good_count}' \
60+
if self.good_count <= 999 else '999+'
61+
62+
@property
63+
def bcount(self):
64+
return f'{self.bad_count}' \
65+
if self.bad_count <= 999 else '999+'
66+
3067
class Meta(object):
3168
db_table = 'tb_teacher'
3269
verbose_name = '讲师'

Diff for: Day41-55/code/hellodjango/demo/views.py

+56-18
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,53 @@
11
import json
22

33
from django.http import HttpResponse
4-
from django.shortcuts import render
4+
from django.shortcuts import render, redirect
55

6-
from demo.models import Subject, Teacher
6+
from demo.forms import UserForm
7+
from demo.models import Subject, Teacher, User, proto
78

89

9-
def index(request):
10+
def login(request):
11+
if request.method.lower() == 'get':
12+
return render(request, 'demo/login.html', {})
13+
else:
14+
username = request.POST['username']
15+
try:
16+
user = User.objects.get(username__exact=username)
17+
password = request.POST['password']
18+
hasher = proto.copy()
19+
hasher.update(password.encode('utf-8'))
20+
if hasher.hexdigest() == user.password:
21+
return redirect('sub')
22+
except User.DoesNotExist:
23+
pass
24+
return render(request, 'demo/login.html',
25+
{'hint': '用户名或密码错误'})
26+
27+
28+
29+
def register(request):
30+
if request.method.lower() == 'get':
31+
return render(request, 'demo/register.html',
32+
{'f': UserForm()})
33+
else:
34+
try:
35+
form = UserForm(request.POST)
36+
if form.is_valid():
37+
form.save(commit=True)
38+
return render(request, 'demo/login.html',
39+
{'hint': '注册成功请登录!'})
40+
else:
41+
return render(request, 'demo/register.html',
42+
{'hint': '请输入有效的注册信息', 'f': form})
43+
except:
44+
return render(request, 'demo/register.html',
45+
{'hint': '注册失败, 请尝试其他的用户名!'})
46+
47+
48+
def show_subjects(request):
1049
ctx = {'subjects_list': Subject.objects.all()}
11-
return render(request, 'demo/index.html', ctx)
50+
return render(request, 'demo/subject.html', ctx)
1251

1352

1453
def show_teachers(request, no):
@@ -17,19 +56,18 @@ def show_teachers(request, no):
1756
return render(request, 'demo/teacher.html', ctx)
1857

1958

20-
def make_good_comment(request, no):
21-
teacher = Teacher.objects.get(pk=no)
22-
teacher.good_count += 1
23-
teacher.save()
24-
ctx = {'code': 200, 'result': f'好评({teacher.good_count})'}
25-
return HttpResponse(json.dumps(ctx),
26-
content_type='application/json; charset=utf-8')
27-
28-
29-
def make_bad_comment(request, no):
30-
teacher = Teacher.objects.get(pk=no)
31-
teacher.bad_count += 1
32-
teacher.save()
33-
ctx = {'code': 200, 'result': f'差评({teacher.bad_count})'}
59+
def make_comment(request, no):
60+
ctx = {'code': 200}
61+
try:
62+
teacher = Teacher.objects.get(pk=no)
63+
if request.path.startswith('/good'):
64+
teacher.good_count += 1
65+
ctx['result'] = f'好评({teacher.gcount})'
66+
else:
67+
teacher.bad_count += 1
68+
ctx['result'] = f'差评({teacher.bcount})'
69+
teacher.save()
70+
except Teacher.DoesNotExist:
71+
ctx['code'] = 404
3472
return HttpResponse(json.dumps(ctx),
3573
content_type='application/json; charset=utf-8')

Diff for: Day41-55/code/hellodjango/hellodjango/settings.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
TEMPLATES = [
5656
{
5757
'BACKEND': 'django.template.backends.django.DjangoTemplates',
58-
'DIRS': [os.path.join(BASE_DIR, 'templates')],
58+
'DIRS': [os.path.join(BASE_DIR, 'templates'),],
5959
'APP_DIRS': True,
6060
'OPTIONS': {
6161
'context_processors': [
@@ -123,5 +123,7 @@
123123

124124
# Static files (CSS, JavaScript, Images)
125125
# https://docs.djangoproject.com/en/2.0/howto/static-files/
126-
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
126+
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
127127
STATIC_URL = '/static/'
128+
129+
# APPEND_SLASH = False

Diff for: Day41-55/code/hellodjango/hellodjango/urls.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@
1919
from demo import views
2020

2121
urlpatterns = [
22-
path('', views.index, name='index'),
23-
path('subjects/<int:no>', views.show_teachers),
24-
path('good/<int:no>', views.make_good_comment),
25-
path('bad/<int:no>', views.make_bad_comment),
22+
path('', views.login),
23+
path('login/', views.login),
24+
path('register/', views.register),
25+
path('subjects/', views.show_subjects, name='sub'),
26+
path('subjects/<int:no>/', views.show_teachers),
27+
path('good/<int:no>/', views.make_comment),
28+
path('bad/<int:no>/', views.make_comment),
2629
path('admin/', admin.site.urls),
2730
]

Diff for: Day41-55/code/hellodjango/templates/demo/login.html

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>用户登录</title>
6+
<style>
7+
#login {
8+
width: 250px;
9+
margin: 20px auto;
10+
}
11+
#login form div {
12+
margin: 10px 0;
13+
}
14+
</style>
15+
</head>
16+
<body>
17+
<h1>用户登录</h1>
18+
<hr>
19+
<div id="login">
20+
<p style="color: red; font-size: 12px;">{{ hint }}</p>
21+
<form action="/login/" method="post">
22+
{% csrf_token %}
23+
<div>用户名: </div>
24+
<div>
25+
<input type="text" name="username" required>
26+
</div>
27+
<div>密码: </div>
28+
<div>
29+
<input type="password" name="password" required>
30+
</div>
31+
<div>
32+
<input type="submit" value="登录">
33+
</div>
34+
</form>
35+
<a href="/register">注册新用户</a>
36+
</div>
37+
</body>
38+
</html>
+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<title>用户注册</title>
6+
<style>
7+
#login {
8+
width: 250px;
9+
margin: 20px auto;
10+
}
11+
#login form div {
12+
margin: 10px 0;
13+
}
14+
</style>
15+
</head>
16+
<body>
17+
<h1>用户注册</h1>
18+
<hr>
19+
<div id="login">
20+
<p style="color: red; font-size: 12px;">{{ hint }}</p>
21+
<form action="/register/" method="post">
22+
{% csrf_token %}
23+
<div>用户名: </div>
24+
<div>
25+
{{ f.username }}
26+
</div>
27+
<div>密码: </div>
28+
<div>
29+
{{ f.password }}
30+
</div>
31+
<div>邮箱: </div>
32+
<div>
33+
{{ f.email }}
34+
</div>
35+
<div>
36+
<input type="submit" value="注册">
37+
</div>
38+
</form>
39+
<a href="/">返回登录</a>
40+
</div>
41+
</body>
42+
</html>

Diff for: Day41-55/code/hellodjango/templates/demo/teacher.html

+21-14
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ <h1>{{ x.name }}老师</h1>
4242
<p>{{ x.intro }}</p>
4343
<p><strong>教学理念</strong></p>
4444
<p>{{ x.motto }}</p>
45-
<a href="/good/{{ x.no }}" class="button">好评({{ x.good_count }})</a>
46-
<a href="/bad/{{ x.no }}" class="button">差评({{ x.bad_count }})</a>
45+
<a href="/good/{{ x.no }}" class="button">好评({{ x.gcount }})</a>
46+
<a href="/bad/{{ x.no }}" class="button">差评({{ x.bcount }})</a>
4747
</div>
4848
<div class="potrait">
4949
{% if x.photo %}
@@ -55,18 +55,25 @@ <h1>{{ x.name }}老师</h1>
5555
{% endfor %}
5656
<script src="{% static 'js/jquery.min.js' %}"></script>
5757
<script>
58-
$(function() {
59-
$('.basic .button').on('click', function(evt) {
60-
evt.preventDefault();
61-
var a = $(evt.target);
62-
var url = a.attr('href');
63-
$.getJSON(url, function(json) {
64-
if (json.code == 200) {
65-
a.text(json.result);
66-
}
67-
});
68-
});
69-
});
58+
$(function() {
59+
$('.basic .button').on('click', function(evt) {
60+
evt.preventDefault();
61+
var $a = $(evt.target);
62+
var url = $a.attr('href');
63+
$.ajax({
64+
'url': url,
65+
'type': 'get',
66+
'data': {},
67+
'dataType': 'json',
68+
'success': function(json) {
69+
if (json.code == 200) {
70+
$a.text(json.result);
71+
}
72+
},
73+
'error': function() {}
74+
});
75+
});
76+
});
7077
</script>
7178
</body>
7279
</html>

0 commit comments

Comments
 (0)