• Django-2


    Django-2

    前后端数据交互练习

    ​ 在html页面中实时更新数据表,并且每一条记录都有与之对应的编辑与删除按钮

    1、配置路由信息
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^$', views.login),
        url(r'^show/', views.show),
        url(r'^edit/', views.edit),
        url(r'^delete/', views.delete),
    ]
    
    2、编写视图函数
    # 展示视图
    def show(request):
        user_list = models.Userinfo.objects.all()
        print(user_list)
        return render(request,'msg.html',locals())
    
    # 编辑视图
    def edit(request):
        edit_id = request.GET.get('user_id')
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            models.Userinfo.objects.filter(pk=edit_id).update(username=username,
                                                               password=password)
            return redirect('/show')
        edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()
        return render(request,'edit.html',locals())
    
    # 删除视图
    def delete(request):
        delete_id = request.GET.get('user_id')
        models.Userinfo.objects.filter(pk=delete_id).delete()
        return redirect('/show')
    
    3、编写html页面
    <table class="table-bordered table tab-content table-hover">
                        <thead>
                        <tr>
                            <th>主键值</th>
                            <th>用户名</th>
                            <th>密码</th>
                            <th>操作</th>
                        </tr>
                        </thead>
                        <tbody>
                            {% for user in user_list %}
                                <tr>
                                <td>{{ user.id }}</td>
                                <td>{{ user.username }}</td>
                                <td>{{ user.password }}</td>
                                <td class="text-center">
                                    <a href="/edit/?user_id={{ user.id }}" class="btn btn-primary btn-sm">编辑</a>
                                    <a href="/delete/?user_id={{ user.id }}" class="btn btn-danger btn-sm">删除</a>
                                </td>
                                </tr>
                            {% endfor %}
    
                        </tbody>
                    </table>
    

    表设计

    针对 图书--出版社--作者

    from django.db import models
    
    # Create your models here.
    class Book(models.Model):
        title = models.CharField(max_length=32)
        # 总共八位 小数占两位
        price = models.DecimalField(max_digits=8,decimal_places=2)
    
        # 书和出版社是一对多的关系  外键字段键在多的一方
        publish_id = models.ForeignKey(to='Publish')  # to指定跟谁是外键关联的  默认关联的是表的主键字段
        """
        ForeignKey字段  django orm在创建表的时候 会自动给该字段添加_id后缀
        """
        # 书和作者是多对多的关系  外键字段建在任何一方都可以  但是 推荐你建在查询频率比较高的一方
        authors = models.ManyToManyField(to='Author')
        """authors字段仅仅是一个虚拟字段 不会再表中展示出来  仅仅是用来告诉django orm 书籍表和作者表示多对多的关系
            自动创建第三张表 
        """
    
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=255)
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        phone = models.BigIntegerField()
        # 一对一字段 建在哪张表都可以  但是推荐你建在 查询频率比较高的那张表
        author_detail = models.OneToOneField(to='AuthorDetail')
        """
        OneToOneField字段  django orm在创建表的时候 会自动给该字段添加_id后缀
        """
    
    class AuthorDetail(models.Model):
        addr = models.CharField(max_length=255)
        age = models.IntegerField()
    
    

    Django详解之路由层

    urls.py 路由与视图函数对应关系

    无名分组

    url(r'^test/(d+)/', views.test),

    ​ 会将(d+)这个正则所限制匹配的url当作位置参数传给视图函数test(),若视图函数没有形参接收时,会直接报错。

    有名分组

    url(r'^test/(?P<month>d+)/', views.test),

    ​ 相当于给有名分组取别名,(?P<month>d+)此时别名为month,会将(d+)这个正则所限制匹配的url当作关键字参数传给视图函数test(),并且视图函数必须用别名month来接收,如果没有形参接收或者不是month这个别名时,都会直接报错。

    注意:有名分组与无名分组不能一起连用。

    反向解析

    动态解析出一个结果 使该结果可以直接访问对应的url

    配置路由

    url(r'^test_add/', views.testadd,name='xxx')

    前端解析

    {% url 'xxx' %}

    后端解析

    url = reverse('xxx')

    无名分组反向解析

    配置路由

    url(r'^test_addsajdsjkahdkjasjkdh/(d+)/', views.testadd,name='xxx'),

    前端解析

    <a href="{% url 'xxx' 1 %}">222</a>

    后端解析

    url = reverse('xxx',args=(1,))

    有名分组反向解析

    配置路由

    url(r'^test_addsajdsjkahdkjasjkdh/(?P<year>d+)/', views.testadd,name='xxx'),

    前端解析

    <a href="{% url 'xxx' year=1 %}">222</a>

    后端解析

    url = reverse('xxx',kwargs={'year':123})

    注意: 反向解析的别名 一定不要重复

    路由分发

    django里面的app可以有自己的static文件夹,templates文件夹,urls.py

    • 项目名下面的urls.py不再做路由与视图函数对应关系
    • 而是做一个中转站 只负责将请求分发到不同的app中
    • 然后在app的urls.py完成路由与视图函数的对应关系
    from django.conf.urls import url,include
    
    url(r'^app01/',include(app01_urls)),
    url(r'^app02/',include(app02_urls))
    

    名称空间

    ​ 当有多个app里存在相同的视图函数名时,简单的路由分发一定会引起冲突,因此,为解决这种问题,我们给每个app设定独立的名称空间,这样才不会相互干扰。

    url(r'^app01/',include('app01.urls',namespace='app01'))
    url(r'^app02/',include('app02.urls',namespace='app02'))
    
    print(reverse('app01:index'))
    print(reverse('app02:index'))
    # 通常情况下 起别名的时候 前面可以加上你的应用名
    

    伪静态

    • 将动态网页伪装成静态网页

    • 这样做的目的时为了提高搜索引擎的SEO查询的优先级,只不过,充钱的优先级永远干不过...

    虚拟环境

    • 针对不同的项目,只会安装该项目所用得到的模块,用不到的一概不装
    • 不同的项目有专门的解释器环境与之对应
    • 每创建一个虚拟环境,就类似与重新下载了一个纯净的python解释器
    • 虚拟环境不要创建太多个

    Django版本区别

    大版本分为1.x和2.x

    区别:

    • url.py中前者用的时url,而后者用的是path
    • 并且后者中的path第一个不支持正则表达式,写什么就匹配什么
    • 但是,后者里面还有一个re_path,功能等同于前者的url
  • 相关阅读:
    登录保存用户信息
    GRIDVIEW单击事件
    GRIDVIEW单击双击事件
    gridview打印
    水晶报表
    CRYSTAL net样式
    Web Server 在IIS上部署ASP.NET Core项目
    MVC MVC+EF快速搭建
    MVC MVC常见错误及解决办法
    Open Interface Service WCF三种通信模式
  • 原文地址:https://www.cnblogs.com/dadazunzhe/p/11722852.html
Copyright © 2020-2023  润新知