项目过程中笔记
1. 在HTML页面中,最好使用{% load static %}动态生成静态文件路径,
Django帮我们别名和后面的路径拼接成完整的路径,这样就不用担心静态文件的别名被更改了.
<link rel="stylesheet" type="text/css" href="{% static 'css/reset.css' %}">
图片也是静态文件<img src="{% static 'images/logo02.png' %}">
2. (反向解析name=)
因为我们建立了多个app,然后新建了一个apps,将各app都放到apps下面,我们需要用到二级路由,在各app的urls里面,
我们也需要先导入
from user import views
然后给各url起个别名,利用反向解析,找到url的正则地址,然后通过正则地址,执行相应的函数,这样和动态生成静态文件路径一样,不担心正则匹配的url地址,被改动了
url(r'^register$',views.register,name='register'),
3.Views视图,我个人更倾向于CBV,CBV需要导入View
from django.views import View,然后类继承于View.
class Register(View):比如注册视图
4.返回HTML时,不需要加路径
因为在settings.py里面已经配置好了TEMPLEATS的路径,DIRS': [os.path.join(BASE_DIR, 'templates')],
所以return render(request, 'register.html')时候,'html不需要加路径'
def get(self, request): return render(request, 'register.html')
5.urls.py里面导入views
因为settings.py里面已经加入了apps的搜索路径
import sys
sys.path.insert(0,os.path.join(BASE_DIR,'apps'))
所以本来应该写成from apps.user import views,但是也可以就写成from user import views
from user import views urlpatterns = [ # 因为我使用的是CBV # url(r'^register$',views.register,name='register'), url(r'^register$',views.Register.as_view(),name='register'), ]
6.问题:
RuntimeError: Model class apps.users.models.UserProfile doesn't declare an explicit app_label and either isn't in
an application in INSTALLED_APPS or else was imported before its application was loaded.
- 确认是否在settings.py里面添加了apps路径:
sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
- 确实是否在settings.py里面的 INSTALLED_APPS 里进行了注册
apps.你的app名称就可以了。而不是'apps.order.apps.OrderConfig', # 订单模块
7.业务逻辑流程(比如注册业务处理)
- 接受数据
- 进行数据校验
- 进行业务处理
- 进行应答
1 class RegisterHandle(View): 2 '''注册注册逻辑处理''' 3 # 接受数据 4 # 进行数据校验 5 # 进行业务处理 6 # 进行应答 7 8 def get(self, request): 9 10 pass 11 12 def post(self, request): 13 '''业务处理流程''' 14 # 接受数据 15 username = request.POST.get('user_name') 16 password = request.POST.get('pwd') 17 re_password = request.POST.get('re_pwd') 18 email = request.POST.get('email') 19 allow = request.POST.get('allow') # 是否同意协议 20 print('allow:',allow) 21 22 # 进行数据校验 23 # 这儿引出一个all()方法,参数为可迭代对象,也就是列表,元组等,all():如果所有可迭代对象都为True,那么返回True,否则返回False 24 if not all([username, password, re_password, email]): 25 # 如果数据不完整,返回提示 26 return render(request, 'register.html', {'error_msg_all': '数据不完整!'}) 27 28 # 进行邮箱校验 29 if not re.match(r'^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email): 30 return render(request, 'register.html', {'error_msg_email':'邮箱格式不正确!'}) 31 # 校验两次输入的密码是否一致 32 if password != re_password: 33 return render(request, 'register.html', {'error_msg_same':'两次输入密码不一致!'}) 34 35 # 校验是否同意协议 36 # 如果单选框被选中,返回on,如果没有被选中,返回None. 37 if not allow: 38 return render(request, 'register.html',{'error_msg_agree':'请同意协议!'}) 39 40 # 校验用户名是否重复 41 try: 42 user = models.User.objects.get(username=username) 43 except models.User.DoesNotExist: 44 # 抛出异常说明,数据库中没有此用户,那么同意注册该用户 45 user = None 46 if user: 47 # 如果用户名存在,则不同意注册,返回提示 48 return render(request, 'register.html', {'error_msg_user': '用户名已被注册!'}) 49 # 如果用户名没有被注册,那么进行用户注册: 50 # 这儿注册要用create_user(...),这样密码会以密文形式保存, 51 # 注册方法一:(推荐) 52 # from django.contrib.auth.models import User 53 # User.objects.create_user(username, email, password) 54 # 注册方法二: 55 # from apps.user import models 56 # user = models.User.objects.create_user(username=username, email=email, password=password) 57 # 注册方法三:(密码非加密) 58 # from apps.user import models 59 # user = models.User.objects.create(username=username, email=email, password=password) 60 61 # 这三种注册方式,都会将is_active = 1:也就是激活状态,但是我们一开始不要将它设为激活状态,因为后期需要邮箱激活 62 user = models.User.objects.create_user(username=username, email=email, password=password) 63 user.is_active = 0 64 user.save() 65 # 手动修改一条数据后,需要save() 66 67 # 这儿用到了命名空间,和name的反向解析 68 # 实际跳转http://127.0.0.1:8002/index/ 69 return redirect(reverse('goods:index')) 70 71 # return redirect('/index/?type=哈哈/')
8.用户注册,使用Django提供的注册方式
1 # 校验用户名是否重复 2 try: 3 user = models.User.objects.get(username=username) 4 except models.User.DoesNotExist: 5 # 抛出异常说明,数据库中没有此用户,那么同意注册该用户 6 user = None 7 if user: 8 # 如果用户名存在,则不同意注册,返回提示 9 return render(request, 'register.html', {'error_msg_user': '用户名已被注册!'}) 10 # 如果用户名没有被注册,那么进行用户注册: 11 # 这儿注册要用create_user(...),这样密码会以密文形式保存, 12 # 注册方法一:(推荐) 13 # from django.contrib.auth.models import User 14 # User.objects.create_user(username, email, password) 15 # 注册方法二: 16 # from apps.user import models 17 # user = models.User.objects.create_user(username=username, email=email, password=password) 18 # 注册方法三:(密码非加密) 19 # from apps.user import models 20 # user = models.User.objects.create(username=username, email=email, password=password) 21 22 # 这三种注册方式,都会将is_active = 1:也就是激活状态,但是我们一开始不要将它设为激活状态,因为后期需要邮箱激活 23 user = models.User.objects.create_user(username=username, email=email, password=password) 24 user.is_active = 0 25 user.save() 26 # 手动修改一条数据后,需要save()
9.request请求路径方式:
def index(request): # 地址栏 127.0.0.1:8000/user/?index=哈哈 print("1",request.get_host()) # 127.0.0.1:8002 print("2",request.get_raw_uri()) # 完整的路径,包括网址、路径、参数 print('3',request.path_info) # 路径,不包含参数: /user/ print('4',request.get_full_path()) # 路径加参数: /user/?index=%fsafa%/ # 如果想让其正常显示(有中文的情况下), 需进行如下编码处理【django默认编码是unicode的】 # request.get_full_path().encode('utf-8') # request.path.encode('utf-8') return render(request, 'index.html')
10.form表单中action=‘...’
如果form表单中action不写,默认往当前路径提交