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就不中用了 要是想用 写个全局钩子
原文地址:https://www.cnblogs.com/DemoLi/p/12770272.html