Django——一些使用要点

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"))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值