初用Django容易忽略的一些小东西

编辑器VScode

https://blog.csdn.net/weixin_41064293/article/details/80739268

https://blog.csdn.net/win7583362/article/details/79315055

创建虚拟环境

  pip install virtualenv
  pip install virtualenvwrapper  # 这是对virtualenv的封装版本,一定要在virtualenv后安装 

  选择一个用来存放虚拟环境的文件,如E:/python3

    cd E:python3  # 进入该文件
    virtualenv envname   # 创建一个名字为envname的虚拟环境
    dir     # 查看当前目录可以知道一个envname的文件已经被创建

    删除
   

rmvirtualenv envname

 

  *启动虚拟环境
 

     # 进入虚拟环境文件
      cd envname
      # 进入相关的启动文件夹
      cd Scripts
      activate  # 启动虚拟环境
      deactivate # 退出虚拟环境

  为环境指定Python解释器:
     

virtualenv -p c:\python27\python.exe envname

Setting相关

ALLOWED_HOSTS = ['*']

'DIRS': [os.path.join(BASE_DIR, 'templates')] #设置templates路径

DEBUG = False  #项目上线之后

ALLOWED_HOSTS = ['允许访问的url']


DATABASES = {
             'default':
            {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'mydatabase',
            'USER': 'mydatabaseuser',
            'PASSWORD': 'mypassword',
            'HOST': '127.0.0.1',
            'PORT': '5432',
                  }
              }
LANGUAGE_CODE = 'zh-hans' #使用中国语言

TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间

#静态文件的访问路径
STATIC_URL = '/static/'
#静态文件的存储路径
STATICFILES_DIRS = 
   [
     os.path.join(BASE_DIR, 'static')
   ]


创建APP

    ./manage.py startapp 应用名称
    python manage.py startapp test1

数据库
  一、MySql
    1、 创建数据库,生成迁移文件,创建超级用户
       

create database 数据库名 default charset utf8 collate utf8_general_ci;


        1)生成迁移文件
       

 python manage.py makemigrations


        2)执行迁移生成表
       

python mange.py migrate


        3)创建超级用户
       

python manage.py createsuperuser



  二、models.py,admin.py的编写

    1、models.py
      class Author(models.Model):
          names = models.CharField(max_length=30)
          age = models.IntegerField()
          email = models.EmailField(null=True)
          #增加一个状态列,来表示用户是启用的还是禁用的,默认为True表示启用
          isActive = models.BooleanField(default=True)
      
          def __str__(self):
              return self.names

          # 声明内部类,来定义当前类在管理页面中的展现形式
          class Meta:
                  # 1.修改当前表名为 author
                  db_table='author'
                  # 2.修改实体类在后台管理页中的名称(单数)
                  verbose_name='作者'
                  # 3.修改实体类在后台管理页中的名称(复数)
                  verbose_name_plural = verbose_name
                  # 4.首先按照年龄降序排序,其次按照ID升序排序
                  ordering = ['-age','id']
      class BookInfo(models.Model):
        title = models.CharField(max_length=20)
        date = models.DateField()
        #外键在多类里面, hbook = 
        hbook = models.ForeignKey('Author')
      
      from  xx.models import BookInfo,HeroInfo

      b = BookInfo()
      b.title = '天龙八部'
      #存入数据
      b.save()

      h = HeroInfo()
      h.name = '段誉'
      #建立'天龙八部' 和 '段誉' 的一对多的关系
      h.hbook = b

    

    2、admin后台管理
        http://127.0.0.1:8000/admin/

        链接表

        admin.py
        
        from django.contrib import admin
        from booktest.models import BookInfo,HeroInfo
        
        #注册在后台
        admin.site.register(BookInfo)
        admin.site.register(HeroInfo)


  三、注意事项
    1、null
      如果True,Django将在数据库中将空值存储为NULL。 默认是False.
      blank
      如果True,则允许该字段为空。 默认是False.

      请注意,这与null不同。 null纯粹与数据库相关,而空白与验证相关。 如果一个字段有blank = True,表单验证将允许输入一个空值。
      如果一个字段有blank = False,则该字段将是必需的。
    
    2、primary_key=True
      id = models.AutoField(primary_key=True)
      primary_key
      如果True,则该字段是模型的主键。
      如果你没有为模型中的任何字段指定primary_key = True,Django会自动添加一个IntegerField来保存主键,所以你不需要设置primary_key = True,
      除非您想覆盖默认的主键行为。
      这是一个自动递增的主键。如果您想要指定自定义主键,只需在其中一个字段上指定primary_key = True即可。 如果Django看到你明确
      设置了Field.primary_key,它不会添加自动id列。每个模型只需要一个字段具有primary_key = True(显式声明或自动添加)


Views--视图
    一、
        def index(request):
            return HttpResponse("index")

    二、get_object_or_404()
      views.py 中,用get_object_or_404()函数代替try···except更好,在找不到相关数据时 Django 会自动引起     Http404 错误
      # 用 get_object_or_404() 查询数据
      def detail(request, question_id):
          question = get_object_or_404(Question, pk=question_id)
          return render(request, 'polls/detail.html', {'question': question})

    三、重定向HttpResponseRedirect,
        reverse用了解析url,有参数
      from django.http import HttpResponseRedirect
      from django.core.urlresolvers import reverse

      def myview(request):
          ...
          return HttpResponseRedirect(reverse('index', kwargs={'blog_id': blog_id, 'user_id': user_id}))
          
    四、页面错误
        关闭调试模式之后 DEBUG = False
        404.html  
        # 404 错误
            1、URL,没有配置,或者配置错误
            在Templates下创建一个404.html,自定义404页面

        500.html 
        # 500 错误
            1、视图views,代码错误
            在Templates下创建一个404.html,自定义404页面


Url.py
    1、主目录下的url

      from django.contrib import admin
      from django.urls import include, path,re_path
      # include 是转向pools.urls来处理
      urlpatterns = [
          path('polls/', include('polls.urls',namespace='')),
          path('admin/', admin.site.urls),
          #re_path()
      ]

    2、polls,App的url

      from django.urls import path
      from . import views
      
      app_name = 'polls'
      urlpatterns = [
          path('', views.IndexView.as_view(), name='index'),
          path('<int:pk>/', views.DetailView.as_view(), name='detail'),
          path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
          path('<int:question_id>/vote/', views.vote, name='vote'),
      ]


    3、path转换器
      str,匹配除了路径分隔符(/)之外的非空字符串,这是默认的形式
      int,匹配正整数,包含0。
      slug,匹配字母、数字以及横杠、下划线组成的字符串。
      uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。
      path,匹配任何非空字符串,包含了路径分隔符
    

Templates--模板--标签
  一、form表单csrf_token

  {% csrf_token %}
  <form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
  </form>

  二、404.html
    在Templates下创建一个404.html,自定义404页面

Session COOKIES 相关

#设置session的存储位置在cookie中
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'
SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # 是否关闭浏览器使得Session过期
#只允许http请求访问数据
SESSION_COOKIE_HTTPONLY = True


Djano发送邮箱

https://www.cnblogs.com/hainan-zhang/p/6647980.html   发送图片附件

https://blog.csdn.net/ding_312/article/details/82382985   Djano发邮件验证码

https://blog.csdn.net/qq_38059635/article/details/82468809

# 设置邮件域名
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

# 设置邮件域名(这里用的是阿里云的邮箱)
EMAIL_HOST = 'smtpdm.aliyun.com'

# 设置端口号 (数字默认为25),在部署到服务器上的时候,很多云服务器屏蔽了端口25
EMAIL_PORT = 465

# 邮箱以及授权码,如果是公司用的邮箱,则密码即可,看情况
EMAIL_HOST_USER = '[email protected]'
EMAIL_HOST_PASSWORD='1xxxxx'

# 是否启用安全连接SSL,TLS互斥,只能有一个True,而且要和端口号相匹配     
EMAIL_USER_TLS= False
EMAIL_USE_SSL = True


#默认邮件
DEFAULT_FROM_EMAIL = 'xxxxxxx <[email protected]>'
    from django.core.mail import send_mail,send_mass_mail
    
    #发送一封邮件
    send_mail('Subject here', 'Here is the message.', '[email protected]',
        ['[email protected]'], fail_silently=False)

    #发送多封邮件
    message1 = ('Subject here', 'Here is the message', '[email protected]', ['[email protected]', '[email protected]'])
    message2 = ('Another Subject', 'Here is another message', '[email protected]', ['[email protected]'])
    send_mass_mail((message1, message2), fail_silently=False)

    datatuple = (
        ('Subject', 'Message.', '[email protected]', ['[email protected]']),
        ('Subject', 'Message.', '[email protected]', ['[email protected]']),
    )
    send_mass_mail(datatuple)

猜你喜欢

转载自blog.csdn.net/qq_42684157/article/details/82807802