[TOC]html
QQ: 基本经常使用展现信息<==>更多信息, 节省数据查询时间前端
一对一关系的两张表能够拼成一张表, 反之一张表也能拆成两张一对一的表python
外键设定在一对多中多的一方, 建立表时必须先建立没有外键约束的表git
多对多的外键设定在关系表中正则表达式
# 先创基表再考虑外键关系 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8, decimal_places=2) publish = models.ForeignKey(to='Publish') # 创建出版社与书的一对多关系, 默认关联主键字段 """ 1. 创建书与做者的多对多关系, 建议外键建在查询频率高的一方 2. django orm会自动建立二者之间的关系表 3. author字段是一个虚拟字段, 不会在表中展现 """ author = models.ManyToManyField(to='Author') class Publish(models.Model): title = models.CharField(max_length=32) email = models.EmailField() class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() # 创建做者与做者详情的一对一关系, 建议外键建在查询频率高的一方 author_detail = models.OneToOneField(to='AuthorDetails') # author_detail = models.ForeignKey(to='AuthorDetails', db_constraint='unique') # fk + unique class AuthorDetails(models.Model): phone = models.BigIntegerField() address = models.CharField(max_length=32) # 外键字段同步到数据库中会自动加"_id"
url(r'^test/([0-9]{4})/', views.test)
test(request, x)
url(r'^test_add/(?P<y>\d+)/', views.test_add)
test_add(request, y)
url(r'^index/(\d+)/(?P<y>\d+)/', views.index)
, 报错url(r'^index/(\d+)/(\d+)/', views.index)
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'test/', views.test), url(r'test_add/', views.test_add), ] """ 1. url第一个参数是一个正则表达式, 2. 会与处理获得的前端url路径后缀字符串进行匹配, 3. 一旦匹配到内容, 会马上结束匹配关系, 执行第二个参数对应的函数 """
1.django匹配路由的规律:数据库
2.取消django自动让浏览器加斜杠的功能: settings-->APPEND_SLASH = False
django
3.url(r'^test/$', views.test)
, 限制后缀名只能输入test/, $视状况添加后端
4.路由匹配只匹配url部分, 不匹配?后面get请求携带的参数浏览器
根据一个别名, 动态解析出一个结果,app
该结果能够直接访问对应的url,
多<==>一<==>一
url(r'^home/', views.home,name='xxx')
, 多: 动态变化的url; 一: xxx;
前端反向解析: <a href="{% url 'xxx' %}">111</a>
后端反向解析:
def get_url(request): url = reverse('xxx') print(url) return redirect(url)
访问/index/, 报错: Reverse for 'xxx' with no arguments not found. 1 pattern(s) tried: ['home/(\d+)/']
前端反向解析: <a href="{% url 'xxx' 1 %}">111</a>
,
在解析的时候, 须要指定无名分组内的正则匹配表达式匹配的内容
后端反向解析: reverse('xxx', args=(1, ))
urlpatterns = [ url(r'^index/', views.index), url(r'^home/(\d+)/', views.home, name='xxx'), url(r'^get_url/', views.get_url), ] def index(request): return render(request, 'index.html') # <p><a href="{% url 'xxx' 1 %}">111</a></p> # 数字一般是数据的主键值 def home(request, x): return HttpResponse([x, 'home']) def get_url(request): url = reverse('xxx', args=(1, )) print(url) return redirect(url)
前端反向解析: <a href="{% url 'xxx' yyy=1 %}">111</a>
,
在解析的时候, 须要指定有名分组内的正则匹配表达式匹配的内容
后端反向解析: url = reverse('xxx', kwargs={'yyy': 1})
url(r'^edit_user/(\d+)/', views.edit_user, name='edit') def edit_user(request, edit_id): # edit_id就是用户想要编辑数据主键值 pass """ 模板语法: {% for user_obj in user_list %} <a href='/edit_user/{{user_obj.id}}/'>编辑</a> <a href='{% url 'edit' user_obj.id %}'>编辑</a> {% endfor %} """
from django.conf.urls import url, include from app01 import urls as app01_urls from app02 import urls as app02_urls urlpatterns = [ url(r'^app01/', include(app01_urls)), # 注意: 总路由里面不能以$结尾 url(r'^app02/', include(app02_urls),) ] # 精简写法, 不须要导入, url(r'^app01/', include('app01.urls')),
from django.conf.urls import url from app01 import views urlpatterns = [ url('^reg/', views.reg) ]
前端: <a href="{% url 'app01:reg' %}"></a>
后端: reverse('x:reg')
# 总路由 urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='x')), url(r'^app02/', include('app02.urls', namespace='y')), ] # 两个子路由 urlpatterns = [ url('^reg/', views.reg, name='reg') ] # 视图函数 def reg(request): url = reverse('x:reg') print(url) return HttpResponse('app01 reg')
url('^reg/', views.reg, name='app01_reg')
<form action="" method="post" enctype="multipart/form-data"> <input type="file" name="my_file"> <input type="submit"> </form>
def upload_file(request): if request.method == 'POST': print(request.FILES) # <MultiValueDict: {'my_file': [<TemporaryUploadedFile: test.pdf (application/pdf)>]}> file_obj = request.FILES.get('my_file') # 获取列表中最后一个元素 print(file_obj) # test.pdf, __str__控制打印值 print(file_obj.name) # test.pdf with open(file_obj.name, 'wb') as fw: for line in file_obj: fw.write(line) return render(request, 'upload.html')