关于form组件的补充-------formChoice
form组件的Choice字段
还是基于出版社和书的模型来详解
models.py(模型)
from django.db import models # Create your models here. class Book(models.Model): title = models.CharField(max_length=32) pub_date = models.DateField() price = models.DecimalField(max_digits=5, decimal_places=2) state=models.IntegerField(choices=((1,'已出版'),(2,'未出版')),default=1) #在数据库存储是以数字存储的,怎么取值?book是类的对象--book.get_state_display publish = models.ForeignKey(to="Publish", to_field="id", on_delete=models.CASCADE, null=True) authors = models.ManyToManyField("Author", db_table="book2authors") # 创建关系表 def __str__(self): return self.title class Publish(models.Model): name = models.CharField(max_length=32) city = models.CharField(max_length=32) email = models.CharField(max_length=32) def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() gender=models.IntegerField(choices=((1,'男'),(2,'女'),),default=1)#在数据库存储是以数字存储的,怎么取值?book是类的对象--book.get_gender_display
urls.py(路径分发)
urlpatterns = [ path('admin/', admin.site.urls), path('books/', views.books, name='books'), path('addbooks/', views.addbooks, name='addbooks'), re_path('delbooks/(\d+)', views.delbooks), re_path('editbooks/(\d+)', views.editbooks) ]
view.py(视图函数)
#为Book这个模型创建forms,为了渲染数据和校验使用,所以这个类的字段必须和模型类有个逻辑上的关系
class BookForm(forms.Form):
title=forms.CharField(max_length=32)
price= forms.DecimalField(max_digits=5,decimal_places=2)
pub_date = forms.DateField()
state=forms.ChoiceField(choices=((1,'已出版'),(2,'未出版'))) #选择项,用的最多
publish=forms.ModelChoiceField(models.Publish.objects.all()) #一对多
authors=forms.ModelMultipleChoiceField(models.Author.objects.all()) #多对多
#对于publish和author这两个一对多和多对多的字段也不用考虑那么多直接用formChoice字段,然后把所有的对象取出来赋值到里面就行
#查看书籍
def books(request): booklist = models.Book.objects.all() return render(request, 'books.html', {'booklist': booklist})
#添加书籍
def addbooks(request):
# 通过form/ModelForm以及校验标签渲染字段以及输入框
if request.method == 'POST':
form = Bookform(request.POST)
if form.is_valid():
form.save()
return redirect('/books/')
else:
return render(request, 'addbooks.html', {'form': form})
else:
# form=BookForm() #form组件形式,根据字段选择不同的字段类型
return render(request, 'addbooks.html', {'form': form})
#编辑书籍
def editbooks(request, editbook_id):
editbook=models.Book.objects.filter(pk=editbook_id).first()
if request.method == 'POST':
form=BookForm(request.POST)
if form.is_valid():
form.save()
return redirect('/books/')
else:
return render(request,'editbooks.html',{'form':form})
else:
form=BookForm(edit_book)
return render(request,'editbooks.html',{'form':form})
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器