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
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
fromdjangoimportforms
2+
3+
fromdemo.modelsimportUser
4+
5+
6+
classUserForm(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+
classMeta(object):
12+
model=User
13+
fields= ('username', 'password', 'email')
Lines changed: 33 additions & 0 deletions
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+
fromdjango.dbimportmigrations, models
4+
importdjango.db.models.deletion
5+
6+
7+
classMigration(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+
]

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

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,33 @@
1+
fromhashlibimportsha1
2+
13
fromdjango.dbimportmodels
24
fromdjango.db.modelsimportPROTECT
35

6+
# 高内聚 低耦合
7+
# 面向对象七个设计原则
8+
# 单一职责原则 / 开闭原则 / 依赖倒转原则 / 里氏替换原则 / 接口隔离原则 / 合成聚合复用原则 / 迪米特法则
9+
# 1995年 - GoF - 23个设计模式
10+
# 创建型模式中的原型模式
11+
proto=sha1()
12+
13+
14+
classUser(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+
defsave(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+
classMeta(object):
27+
db_table='tb_user'
28+
verbose_name='用户'
29+
verbose_name_plural='用户'
30+
431

532
classSubject(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+
defgcount(self):
59+
returnf'{self.good_count}' \
60+
ifself.good_count<=999else'999+'
61+
62+
@property
63+
defbcount(self):
64+
returnf'{self.bad_count}' \
65+
ifself.bad_count<=999else'999+'
66+
3067
classMeta(object):
3168
db_table='tb_teacher'
3269
verbose_name='讲师'
Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,53 @@
11
importjson
22

33
fromdjango.httpimportHttpResponse
4-
fromdjango.shortcutsimportrender
4+
fromdjango.shortcutsimportrender, redirect
55

6-
fromdemo.modelsimportSubject, Teacher
6+
fromdemo.formsimportUserForm
7+
fromdemo.modelsimportSubject, Teacher, User, proto
78

89

9-
defindex(request):
10+
deflogin(request):
11+
ifrequest.method.lower() =='get':
12+
returnrender(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+
ifhasher.hexdigest() ==user.password:
21+
returnredirect('sub')
22+
exceptUser.DoesNotExist:
23+
pass
24+
returnrender(request, 'demo/login.html',
25+
{'hint': '用户名或密码错误'})
26+
27+
28+
29+
defregister(request):
30+
ifrequest.method.lower() =='get':
31+
returnrender(request, 'demo/register.html',
32+
{'f': UserForm()})
33+
else:
34+
try:
35+
form=UserForm(request.POST)
36+
ifform.is_valid():
37+
form.save(commit=True)
38+
returnrender(request, 'demo/login.html',
39+
{'hint': '注册成功请登录!'})
40+
else:
41+
returnrender(request, 'demo/register.html',
42+
{'hint': '请输入有效的注册信息', 'f': form})
43+
except:
44+
returnrender(request, 'demo/register.html',
45+
{'hint': '注册失败, 请尝试其他的用户名!'})
46+
47+
48+
defshow_subjects(request):
1049
ctx={'subjects_list': Subject.objects.all()}
11-
returnrender(request, 'demo/index.html', ctx)
50+
returnrender(request, 'demo/subject.html', ctx)
1251

1352

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

1958

20-
defmake_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-
returnHttpResponse(json.dumps(ctx),
26-
content_type='application/json; charset=utf-8')
27-
28-
29-
defmake_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+
defmake_comment(request, no):
60+
ctx={'code': 200}
61+
try:
62+
teacher=Teacher.objects.get(pk=no)
63+
ifrequest.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+
exceptTeacher.DoesNotExist:
71+
ctx['code'] =404
3472
returnHttpResponse(json.dumps(ctx),
3573
content_type='application/json; charset=utf-8')

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

Lines changed: 4 additions & 2 deletions
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

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,12 @@
1919
fromdemoimportviews
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
]
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<!doctype html>
2+
<htmllang="en">
3+
<head>
4+
<metacharset="UTF-8">
5+
<title>用户登录</title>
6+
<style>
7+
#login{
8+
width:250px;
9+
margin:20px auto;
10+
}
11+
#loginformdiv{
12+
margin:10px0;
13+
}
14+
</style>
15+
</head>
16+
<body>
17+
<h1>用户登录</h1>
18+
<hr>
19+
<divid="login">
20+
<pstyle="color: red; font-size: 12px;">{{hint }}</p>
21+
<formaction="/login/" method="post">
22+
{% csrf_token %}
23+
<div>用户名: </div>
24+
<div>
25+
<inputtype="text" name="username" required>
26+
</div>
27+
<div>密码: </div>
28+
<div>
29+
<inputtype="password" name="password" required>
30+
</div>
31+
<div>
32+
<inputtype="submit" value="登录">
33+
</div>
34+
</form>
35+
<ahref="/register">注册新用户</a>
36+
</div>
37+
</body>
38+
</html>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<!doctype html>
2+
<htmllang="en">
3+
<head>
4+
<metacharset="UTF-8">
5+
<title>用户注册</title>
6+
<style>
7+
#login{
8+
width:250px;
9+
margin:20px auto;
10+
}
11+
#loginformdiv{
12+
margin:10px0;
13+
}
14+
</style>
15+
</head>
16+
<body>
17+
<h1>用户注册</h1>
18+
<hr>
19+
<divid="login">
20+
<pstyle="color: red; font-size: 12px;">{{hint }}</p>
21+
<formaction="/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+
<inputtype="submit" value="注册">
37+
</div>
38+
</form>
39+
<ahref="/">返回登录</a>
40+
</div>
41+
</body>
42+
</html>
File renamed without changes.

‎Day41-55/code/hellodjango/templates/demo/teacher.html‎

Lines changed: 21 additions & 14 deletions
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-
<ahref="/good/{{x.no }}" class="button">好评({{x.good_count }})</a>
46-
<ahref="/bad/{{x.no }}" class="button">差评({{x.bad_count }})</a>
45+
<ahref="/good/{{x.no }}" class="button">好评({{x.gcount }})</a>
46+
<ahref="/bad/{{x.no }}" class="button">差评({{x.bcount }})</a>
4747
</div>
4848
<divclass="potrait">
4949
{% if x.photo %}
@@ -55,18 +55,25 @@ <h1>{{x.name }}老师</h1>
5555
{% endfor %}
5656
<scriptsrc="{% static 'js/jquery.min.js' %}"></script>
5757
<script>
58-
$(function(){
59-
$('.basic .button').on('click',function(evt){
60-
evt.preventDefault();
61-
vara=$(evt.target);
62-
varurl=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+
varurl=$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)