django_day10_项目相关

  • 展示数据的方法

    • 数据对象obj

      • 普通字段
      1. obj.字段名 ====》 数据库该字段的值
      • 带choices参数的

        1. obj.字段名 ====》 数据库该字段的值
        2. obj.get_字段名_display() ====》 要显示的结果
      • 外键

        1. obj.外键====》 所关联的对象 __str__ 方法
        2. obj.外键.字段
      • 自定义方法

        from django.utils.safestring import mark_safe
        def show_publish_status(self):
        color_dict = {True:'green',False:'#772a4d'}
        return mark_safe('<span style="background: {};color: white;padding: 3px">{}</span>'.format(color_dict[self.publish_status],self.get_publish_status_display()))
  • 定义modelform

    class ArticleForm(forms.ModelForm):
    class Meta:
    model = models.Article#只能是model
    fields = "__all__"
    exclude = ['detail']
    # widgets = {
    # 'title':forms.TextInput(attrs={'class':'form-control'})
    # }
    def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)#执行父类方法
    #自定义的操作
    # self.fields 是个有序字典 字典中的值就是字段的对象
    for field in self.fields.values():#field 就是models中定义的字段
    field.widget.attrs['class'] = 'form-control'#field.widgrt
    # 是拿到对应的插件的对象field.widget.attrs 然后拿到对应的属性做修改
  • 使用form

    def article_add(request):
    form_obj = ArticleForm()#什么都不传
    if request.method == 'POST':
    form_obj = ArticleForm(request.POST)#拿到form表单
    #开始校验
    if form_obj.is_valid():
    #获取文章详情字符串
    detail = request.POST.get('detail')
    # 创建文章详情对象
    detail_obj = models.ArticleDetail.objects.create(content=detail)
    form_obj.instance.detail_id = detail_obj.pk
    form_obj.save() # form_obj.instance.save()
    return redirect('article_list')
    return render(request, 'article_add.html', {'form_obj': form_obj}) #关联了俩个表
    def article_edit(request, pk):
    obj = models.Article.objects.filter(pk=pk).first() # 查到一个queryset对象 first拿到第一个 如果没有则返回为null
    form_obj = ArticleForm(instance=obj) #传了个instance对象
    if request.method == 'POST':
    form_obj = ArticleForm(request.POST, instance=obj) # 包含数据库没修改之前的数据 以及表单提交的数据
    if form_obj.is_valid(): # 通过校验
    form_obj.instance.detail.content = request.POST.get('detail')
    form_obj.instance.detail.save()# 修改以后 还要保存 文章详情
    form_obj.save()# 保存文章的信息
    return render(request, 'article_edit.html', {'form_obj': form_obj, 'obj': obj}) #HTML
    <form class="form-horizontal" method="post" action="" novalidate>
    {% csrf_token %}
    {% for field in form_obj %} {{ field.id_for_label }} # 拿到id {{ field.label }} #提示信息 models中的 verbose_name {{ field }} #生成input框 {{ field.errors.0 }} #错误 {% endfor %}
    </form>
  • 让用户上传图像

    #model中添加ImageField
    avatar = models.ImageField(upload_to='img/avatar',default='img/avatar/default.jpg') #ImageField 依赖pillow模块 #settings.py中的配置
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR,'media') #urls.py中的配置
    from django.views.static import serve
    from django.conf import settings
    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^', include('app01.urls')),
    url(r'^media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT}),
    ] #模板中使用
    注册时:form中加上 enctype="multipart/form-data"
    显示时:<img width="20px" src="/media/img/avatar/张伟.jpg" alt=""> #views中
    form_ojb = RegForm(request.POST,request.FILES)
  • 使用django-ckeditor

    1. 下载pip install django-ckeditor

    2. 注册app

      INSTALLED_APPS = [
      ........
      'ckeditor',
      'ckeditor_uploader',
      ]
    3. urls.py

      urlpatterns = [
      .........................
      url(r'^ckeditor/', include('ckeditor_uploader.urls')),
      ]
    4. models.py

      class ArticleDetailForm(forms.ModelForm):
      
          class Meta:
      model = models.ArticleDetail # 只能是model
      fields = "__all__"
      form_obj = ArticleDetailForm()#实例化
    5. html

      {{ form_obj.content }}

      引用静态文件

      {% block js %}
      {% load static %}
      <script type="text/javascript" src="{% static "ckeditor/ckeditor-init.js" %}"></script>
      <script type="text/javascript" src="{% static "ckeditor/ckeditor/ckeditor.js" %}"></script>
      {% endblock %}
    6. 上传需要认证,取消认证

      #将staff_member_required这个装饰器取消掉
      urlpatterns = [
      url(r'^upload/', staff_member_required(views.upload), name='ckeditor_upload'),
      url(r'^browse/', never_cache(staff_member_required(views.browse)), name='ckeditor_browse'),
      ] #改为下面这样
      from ckeditor_uploader import views urlpatterns = [
      url(r'^upload/', views.upload, name='ckeditor_upload'),
      url(r'^browse/', never_cache(views.browse), name='ckeditor_browse'),
      ]

最新文章

  1. CMT learning
  2. 学习maple
  3. 一 java线程的等待/通知模型
  4. tar exclue文件夹
  5. Mango Weekly Training Round #6 解题报告
  6. 【剑指Offer学习】【面试题55:字符流中第一个不反复的字符】
  7. 在什么情况下使用struct,struct与class的区别
  8. 如何用webbrowser获取ajax动态生成的网页的源码?
  9. win10 64位下装Virtual Box安装Linux(centOS)配置联网
  10. Fast data loading from files to R
  11. win10环境下如何运行debug
  12. python vs vscode问题汇总
  13. 一种导致 emwin 中 EDIT 控件不显示的情况
  14. gitlab之三: gitlab邮件通知的配置
  15. 利用pyusb来查询当前所以usb设备
  16. BZOJ 1601 [Usaco2008 Oct]灌水 (最小生成树)
  17. e585. Converting Between RGB and HSB Colors
  18. vue 引入通用 css
  19. 安卓 Activity 生命周期
  20. Android开发--用户定位服务--UserLocation

热门文章

  1. SAP FPM 相关包 APB_FPM_CORE
  2. React技巧之打开文件输入框
  3. java常见的面试题(一)
  4. 爬虫(9) - Scrapy框架(1) | Scrapy 异步网络爬虫框架
  5. 4-11 CS后台项目-4 及 Redis缓存数据
  6. shell脚本三剑客:grep、sed、awk
  7. MoCo V1:视觉领域也能自监督啦
  8. 输出以二叉树表示的算术表达式(严6.51)--------西工大noj
  9. 使用codeblocks创建新项目
  10. input 回车输入+选择标签