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>
效果:
-
在字段中加入class属性
-
第一种方法
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 然后拿到对应的属性做修改
<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就不中用了 要是想用 写个全局钩子
-