django

作者: 猪肉楠 | 来源:发表于2017-02-27 22:36 被阅读0次
    1、安装django,版本等于1.9,安装python的mysql驱动
      pip install django==1.9
      yum -y install mysql-devel gcc python-devel安装mysql-python需要的依赖
      pip install mysql-python
    2、添加项目后对settings修改
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': "mxonline",
            'USER': "root",
            "PASSWORD": "123456",
            "HOST": '127.0.0.1'
        }
    }
    3、安装mariadb,并且修改字符集
      yum -y install mariadb-server mariadb
      vim /etc/my.cnf
        在mysqld下添加  character_set_server = utf8
    4、进行数据迁移,pycharm点击Tools->Run manage.py Tasks
      makemigrations
      migrate
    5、开始app
      startapp users
    6、添加自定义用户model
      from django.contrib.auth.models import AbstractUser
      class UserProfile(AbstractUser):
        自定义字段
    7、设置认证model,安装应用
      在settings 加上 AUTH_USER_MODEL = 'users.UserProfile' 即可将本身系统自带的认证设置为自定义认证
      在settings 中的 INSTALLED_APPS 后追加 appname 即可将应用安装
    8、当把多个app放到一个工程根目录下的文件夹后,编辑器的语法不能再检测到在应用中import到的包,如果用的是pycharm,则可以将这个目录使用右键->mark directory as->sources root 这样编辑器便会识别,不再报错 
      这个目录使用右键->mark directory as->sources root
    但是这样做了以后,只是编辑器会识别,如果运行server,还是不能真正的运行,则需要在settings文件里边添加如下设置:
      import sys
      sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
    9、在manage.py 执行任务,使用createsuperuser来创建django的用来登陆admin用户
    10、使用django-admin的时候,在settings中的多语言设置中,可以设置为中文
      LANGUAGE_CODE = 'zh-hans'
      TIME_ZONE = 'Asia/Shanghai' 
      USE_TZ = False 
    11、在admin中注册已经写好的model,如下,将user app中的UserProfile注册到admin中
    from .models import UserProfile
    
    
    class UserProfileAdmin(admin.ModelAdmin):
        pass
    
    admin.site.register(UserProfile, UserProfileAdmin)
    12、一个bug,在某些django版本中,使用自定义User后,在创建用户的时候,数据库中的django_admin_log不能正确的写入,原因是,这个表中有一个外键约束,针对的是auth_user表,但所由于自定义了User,使用的是自定义用户,则外键约束失败,解决方法是,删除外键约束,然后重新添加一个针对自定义User表id的约束即可
      CONSTRAINT django_admin_log_user_id_c564eba6_fk_auth_user_id FOREIGN KEY (user_id) REFERENCES users_userprofile (id)
    13、安装xadmin
      pip install/uninstall xadmin
      在settings中把xadmin和xadmin的依赖安装进去
        crispy_forms xadmin
      在urls.py中使用xadmin替换admim
        import xadmin
        url(r'^xadmin/', xadmin.site.urls),
    14、源码安装xadmin
      在github上搜索xadmin,第一个结果就是,下载以后解压放到项目根目录下,然后新建一个extra_apps,用来存放第三方的应用,把xadmin放进去。然后mark directory as sources root,这样也可以,但是要记住,每当mark 一个文件夹以后,必须在settings中添加BASE_DIR。
      sys.path.insert(0, os.path.join(BASE_DIR, 'extra_apps'))
    15、注册使用xadmin,在app下新建文件adminx.py,然后写入以下内容
    import xadmin
    from .models import EmailVerifyRecord
    class EmailVerifyRecordAdmin(object):
        list_display = ['id', 'code', 'email', 'send_type', 'send_time']
          此项决定了在xadmin中查看记录的时候显示的子段
        search_fields = ['id', 'code', 'email', 'send_type']
          此项决定了在xadmin中那些子段可以被搜索
        list_filter = ['code', 'email', 'send_type', 'send_time']
          此项决定了在xadmin中那些子段可以被过滤
    xadmin.site.register(EmailVerifyRecord, EmailVerifyRecordAdmin)
    16、xadmin的全局设置,在随便一个adminx设置即可
    from xadmin import views
    class BaseSetting(object):
        # 主题功能,第一个是开启主题,第二个是使用其他主题
        enable_themes = True 
        use_bootswatch = True
    # 要进行注册才生效
    xadmin.site.register(views.BaseAdminView, BaseSetting)
    class GlobalSettings(object):
        # 修改页面页头和页脚文字,设置菜单类型为收缩类型
        site_title = u'在线教学网'
        site_footer = u'在线教学网'
        menu_style = 'accordion' 
    # 要进行注册才生效
    xadmin.site.register(views.CommAdminView, GlobalSettings)
    在设置了menu_style以后,菜单显示为英文,这是因为没有配置app的名称
      在app对应的文件夹下,打开apps.py 文件,在对于的class下加入 verbose_name = u'用户操作'
        class OrganizationConfig(AppConfig):
          name = 'organization'
          verbose_name = u'用户操作'
      在app对于的文件夹下,打开__init__.py文件,在第一行加入 
        default_app_config = "organization.apps.OrganizationConfig"
    17、将静态页面直接返回
        在urls.py配置
          from django.views.generic import TemplateView
          urlpatterns = [
            url('^$', TemplateView.as_view(template_name="index.html"), name="")
          ]
    18、配置静态文件的位置
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static")
        )
    19、配置自定义验证,使其支持邮箱验证
        settings.py +++
        AUTHENTICATION_BACKENDS = (
            'users.views.CustomBackend'
        )
        views.py +++
        from django.db.models import Q
        from django.contrib.auth.backends import ModelBackend
        class CustomBackend(ModelBackend):
            def authenticate(self, username=None, password=None, **kwargs):
                try:
                    user = UserProfile.objects.get(Q(username=username)|Q(email=username))
                    if user.check_password(password):
                        return user
                except Exception as e:
                    return None
    20、配置使用url和static标签
    {% url 'index' %} 其中 index 代表在urls.py中配置的name项目
    {% static 'css/index.css' %} 其中 css/index.css代表与配置文件中设置的STATIC_URL的相对路径
        在使用此标签,必须在页面前边加上{% load staticfiles %} 
    21、安装验证码
        pip install django-simple-captcha==0.4.6
        settings.py +++
            INSTALLED_APPS 中加入captcha
        urls.py +++
            url(r'^captcha/', include('captcha.urls')),
        运行manage.py ,makemigrations、migrate
        在forms.py中加入
            from captcha.fields import CaptchaField
            captcha = CaptchaField()
        在views.py 中加入
            from .forms import RegisterForm
        在views.py 中对于的方法中加入
            captcha_form = RegisterForm(error_messages={'invalid': u'验证码出错'}) # 括号中error_messages是自定义报错信息的
        然后将captcha_form 渲染到前端,然后在前端使用{{ captcha_form.captcha }}
    22、配置使用input 的文件标签来进行上传的文件的保存地址
        settings.py +++
            MEDIA_URL = '/media/'
            MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    23、配置在模板中使用{{ MEDIA_URL }}
            settings.py +++ 这样在模板中才认识{{ MEDIA_URL }}
              TEMPLATES>OPTIONS>context_processors 增加
                'django.core.context_processors.media',
            urls.py +++
              from django.views.static import serve
              from muxue.settings import MEDIA_ROOT
              url(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}),
    24、django的分页功能配置
        pip install django_pure_pagination
        settings.py +++
          INSTALLED_APPS = (
            ...
            'pure_pagination',
          )
        settings.py +++ 
          PAGINATION_SETTINGS = {
            'PAGE_RANGE_DISPLAYED': 4,
            'MARGIN_PAGES_DISPLAYED': 1,
            'SHOW_FIRST_PAGE_WHEN_INVALID': True,
          }
        其他代码参照github上的教程
          https://github.com/jamespacileo/django-pure-pagination
    25、数据库操作
        排序并限制取的个数 all_org.order_by("-click_nums")[:3] 
    26、模板操作
        for 循环中,使用 {{ forloop.counter }}或者 {{ forloop.counter0 }}来取得for循环的递增数
    27、djang ModelForm
        forms.py +++
          from django.forms import ModelForm
          from operation.models import UserAsk
          class UserAskModelForm(ModelForm):
              class Meta:
                  model = UserAsk
                  fields = ['name', 'mobile', 'course_name']
        views.py +++
          from organization.forms import UserAskModelForm
          user_ask_form = UserAskModelForm(request.POST)
          if user_ask_form.is_valid():
              user_ask = user_ask_form.save(commit=True)
              return HttpResponse(simplejson.dumps(data, ensure_ascii=False), content_type='application/json')
    28、自定义正则验证手机号
    forms.py +++
    class UserAskModelForm(forms.ModelForm):
        class Meta:
            model = UserAsk
            fields = ['name', 'mobile', 'course_name']
    
        def clean_mobile(self):
            mobile = self.cleaned_data['mobile']
            regex_mobile = "^1[358]\d{9}$|^147\d{8}$|^176\d{8}$"
            p = re.compile(regex_mobile)
            if p.match(mobile):
                return mobile
            else:
                raise forms.ValidationError(u"手机号码非法", code="mobile invalid!")
    29、django中使用ajax之csrf添加.(没有form的情况下不能将csrf_token放进去)
      function add_fav(current_elem, fav_id, fav_type){
          $.ajax({
              cache: false,
              type: "POST",
              url:"/org/add_fav/",
              data:{'fav_id':fav_id, 'fav_type':fav_type},
              async: true,
              beforeSend:function(xhr, settings){
                  xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
              },
              success: function(data) {
                  if(data.status == 'fail'){
                      if(data.msg == '用户未登录'){
                          window.location.href="login.html";
                      }else{
                          alert(data.msg)
                      }
                  }else if(data.status == 'success'){
                      current_elem.text(data.msg)
                  }
              },
          });
      }
    30、django中使用返回json
      return HttpResponse(simplejson.dumps(data, ensure_ascii=False), content_type='application/json')
    31、在django中前端模板中显示model中的选择性字段,让其显示非数据库中保存的内容。
      比如在model中设置的是
        COURSE_DEGREE_CHOICES = (('primary', u'初级'), ('middle', u'中级'),('high', u'高级'))
        degree = models.CharField(max_length=10, choices=COURSE_DEGREE_CHOICES, verbose_name=u'难度')
      想要在前端页面显示初级,中级,高级字段,而不是显示primary、middle、high,在模板中使用{{ course.get_degree_display }}
    32、在model中加入自定义函数来返回外键的数量,然后在模板中调用此函数
      def get_lesson_numbers(self): 
        return self.lesson_set.all().count() # 其中lesson类中,此类是lession的外键。
      模板中使用 {{ course.get_lesson_numbers }}来显示
    33、用filter 查找满足多个值的记录
      user_id = [1, 2, 3, 4, 5, 6, 7]
      all_user_courses = UserCourse.objects.filter(user_id__in=user_id)
        双下划线加in 后边加上数组,即可查出所有满足条件的记录
    34、在django模板文件中使用请求的链接uri
      {% if request.path | slice '7' == '/course' %} 
      {% endif %}
        这个判断如果uri 前7位是/course 的话,就显示代码块中的内容
    35、django 中orm 操作数据库like查询
      all_courses = all_courses.filter(name__icontains=search_keywords) name字段like查询
    36、diango 中 用Q 来进行查询
      all_courses = all_courses.filter(Q(name__icontains=search_keywords)|Q(detail__icontains=search_keywords) name字段like查询 或者 detail字段like查询
    37、django 模板中如果为空设置默认值
      {{ request.user.mobile | default_if_none: '' }} 这样如果是在数据库中是None,则在模板中不会显示None
    38、django 中异步修改头像这种文件
      新建一个modelform
        class UploadImageForm(forms.ModelForm):
          class Meta:
            model = UserProfile
            filelds = ['image']
      在view中使用,其中instance=request.user代表要修改的实例,如果不加,则代表新建一个
        image_form = UploadImageForm(requets.POST, request.FILES, instance=request.user)
        if image_form.is_valid():
          image_form.save()
    39、当使用class作为View的逻辑处理,而不是函数时,如何做登录验证,如果用函数是用@login_required
      在apps下的utils包中,新建一个文件mixin_utils.py
      from django.contrib.auth.decorators import login_required
      from django.utils.decorators import method_decorator
      class LoginRequiredMixin(object):
        @method_decorator(login_required(login_url='/login'))
        def dispatch(self, request, *args, **kwargs):
        return super(LoginRequiredMixin, self).dispatch(request, *args, **kwargs)
      在需要做是否登录验证的class中,继承
      from utils.mixin_utils import LoginRequiredMixin
      class CommentsView(LoginRequiredMixin, View):
        pass
    40、当debug模式设置为False的时候,以前在使用{% static %}的情况就不能继续使用
    需配置在settings中
      STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    需配置在url中  
      from MxOnline.settings import STATIC_ROOT
      url(r'^static/(?P<path>.*)$', serve, {"document_root":STATIC_ROOT}),
    41、配置全局404和500页面
      在任意view.py中加入一个函数
        def page_not_found(request):
          from django.shortcuts import render_to_response
          response = render_to_response('404.html',{})
          response.status_code = 404
          return response
      关闭debug模式,将ALLOWED_HOSTS = ['*'] 在settings文件中设置
      在urls.py文件中加入:
        handler404 = 'users.views.page_not_fount'   其中users为写入函数所在的app中
    42、模板中判断是否能被一个数整除
      {% if forloop.counter | divisibleby:5 &} five {% endif %}
    43、模板中给一个数值加指定值
      {{ forloop.counter|add:2 }}
    44、在方法中返回地址重定向
      from django.core.urlresolvers import reverse
      return HttpResponseRedirect(reverse("index"))
    

    相关文章

      网友评论

          本文标题:django

          本文链接:https://www.haomeiwen.com/subject/scytgttx.html