zoukankan      html  css  js  c++  java
  • django_day09_项目相关

    django_day09_项目相关

    展示数据:

    • 给模板一个querySet对象列表,循环出对象列表obj

      • 普通字段

        • obj.字段名 ----》 数据库中的数据
      • 外键

        • obj.外键 -------》外键的对象 给类定义__ str__的方法
      • 带choices参数的

        • obj.字段名 ------》 数据库中的数据这个显示不是很好i
        • obj.get_ 字段名 _display() 显示定义好的结果 在模板中使用不加()
      • 自定义方法

            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()))
        
        
         {{form_obj.title.label}} #指定的是models.py 里面的字段中的:verbose_name='文章标题'
        
      • 循环生成form表单

        #models中(数据库中)
        class Article(models.Model):
            """
            标题,文章内容 作者  板块 创建时间  更新时间  删除状态
        
            """
            title = models.CharField(max_length=64,verbose_name='文章标题')
            abstract = models.CharField(max_length=256,verbose_name='文章摘要')
            content = models.TextField(verbose_name='文章内容')
            author = models.ForeignKey(User,on_delete=models.DO_NOTHING,blank=True,verbose_name='作者')
            category = models.ForeignKey(Category,on_delete=models.DO_NOTHING,blank=True,null=True,verbose_name='分类')
            creat_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
            update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
            publish_status = models.BooleanField(choices=((False,'未发布'),(True,'发布')),default=False,verbose_name='发布状态')
            detail = models.OneToOneField('ArticleDetail',on_delete=models.DO_NOTHING)
            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()))
        
        #forms.py
        class ArticleForm(forms.ModelForm):
            class Meta:
                model = models.Article#只能是model
                fields = "__all__"
                exclude = ['detail','content']
         #views.py中
        def article_add(request):
        
            form_obj = ArticleForm()
        
            return render(request,'article_add.html',{'form_obj':form_obj})
        
        #模板中
             <form class="form-horizontal">
            {% for field in form_obj %}
            <div class="form-group">
                    <label for="{{field.id_for_label}}" class="col-sm-2 control-label">{{field.label}}</label>
                    <div class="col-sm-10">
                       {{field }}
                    </div>
                </div>
        

        效果:

        image-20200415211241287

      • 在字段中加入class属性

        • 第一种方法

          widgets = {
                      'title':forms.TextInput(attrs={'class':'form-control'})
                  }
          #这样的话每个都加很麻烦
          

          image-20200415211658029

        • 第二中方法

              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 然后拿到对应的属性做修改
          
          <div class="col-sm-8">   修改长度!
          
      • 发送POST请求

            if request.method == 'POST':
                form_obj = ArticleForm(request.POST)#拿到form表单
                #开始校验
                if form_obj.is_valid():
                    form_obj.save()#保存
                    return redirect('article_list')
        
        <form class="form-horizontal" method="post" novalidate>
            {% csrf_token %}
            
        
      • 插入数据—有两张表需要同时存储 额外加一个input输入框

         <div class="form-group">
                    <label for="detail" class="col-sm-2 control-label">文章详情</label>
                    <div class="col-sm-8">
                     <textarea class="form-control" rows="3" id="detail"></textarea>
                    </div>
                </div>
        
        def article_add(request):
            form_obj = ArticleForm()
            if request.method == 'POST':
                form_obj = ArticleForm(request.POST)#拿到form表单
        
                #开始校验
                if form_obj.is_valid():
                    # form_obj.save()#保存  要插入两张表的内容不用这个
                    #插入文章详情
                    detail = request.POST.get('detail')
                    detail_obj = models.ArticleDetail.objects.create(content=detail) #拿到文章详情对象
                    #往文章里插入内容
                    #form_obj.cleaned_data  星星打散就可以拿到生成的表单中数据  但是还有自己创建的没加上
                    #额外加一个
                    #插入文章
                    form_obj.cleaned_data['detail_id'] = detail_obj.pk
                    models.Article.objects.create(**form_obj.cleaned_data)
                    return redirect('article_list')
            return render(request,'article_add.html',{'form_obj':form_obj})
        
        • 手动cleaned_data 添加之后用save就不中用了 要是想用 写个全局钩子
  • 相关阅读:
    达叔系列——神经网络编程基础
    win10安装pytorch——前面有坑,快跳进去鸭
    Python基础(六)——面向对象编程
    Python基础(五)——闭包与lambda的结合
    Python基础(四)——迭代器/对象,生成器
    Mysql优化(出自官方文档)
    Mysql优化(出自官方文档)
    Scala语言笔记
    Scala语言笔记
    Scala语言笔记
  • 原文地址:https://www.cnblogs.com/DemoLi/p/12770272.html
Copyright © 2011-2022 走看看