from django import forms
class BookFrom(forms.Form):
title = forms.CharField(
label="书名",
max_length=32,
)
publishDate = forms.DateField(
label="出版日期",
widget=forms.widgets.TextInput(attrs={"type": "date"})
)
price = forms.DecimalField(
label="价格",
max_digits=5,
decimal_places=2
)
# 一对多关系 方案一 写死了
'''
# publishs = forms.ForeignKey(to="Publish")
publishs = forms.ChoiceField(
label="出版社",
choices=[
(1, "滑稽出版社"),
(2, "人民出版社"),
(3, "垃圾出版社"),
],
widget=forms.widgets.Select()
)
'''
# 写活了
publishs = forms.ModelChoiceField(
label="出版社",
queryset=models.Publish.objects.all() # 获取一个queryset对象直接拿来生成choices使用
)
# 多对多关系 方案一
'''
# authors = forms.ManyToManyField(to='Author',)
authors = forms.MultipleChoiceField(
label='作者',
choices=[
(1, "李二蛋"),
(2, '王思丹'),
],
widget=forms.widgets.SelectMultiple(),
)
'''
authors = forms.ModelMultipleChoiceField(
label='作者',
queryset=models.Author.objects.all()
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for field in self.fields.values(): # self.fields 获取所有的字段
field.widget.attrs.update(
{"class": "form-control"}) # 为获取到的字典对象添加属性
# form只能对添加字段进行验证
def addbooks(request):
if request.method == 'GET':
book_form_obj = BookFrom()
return render(request, 'add_book.html', {
'book_form_obj': book_form_obj,
})
if request.method == 'POST':
print(request.POST)
book_form_obj = BookFrom(request.POST)
if book_form_obj.is_valid():
print(book_form_obj.cleaned_data)
# {'title': '屠龙勇士', 'publishDate': datetime.date(2020, 7, 10), 'price': Decimal('1'), 'publishs': <Publish: 人民出版社>, 'authors': <QuerySet [<Author: 李二蛋>]>}
authors = book_form_obj.cleaned_data.pop("authors")
new_book = models.Book.objects.create(
**book_form_obj.cleaned_data
)
new_book.authors.add(*authors) # 多对多可能传入多个做个 通过*打散传入多对多表
return redirect('showbooks')
else:
return render(request, 'add_book.html', {
'book_form_obj': book_form_obj,
})
def editbooks(request, book_id):
book_obj = models.Book.objects.filter(pk=book_id)
if request.method == 'GET':
# BookFrom({"key":value}) 接受的是这种值
# 我们可以直接获取值发送给前端生成展示页面
# 问题:多对多表和一对多表示queryset类型,key取值只能获取到字典
# 无法实现(实现繁琐) 我们使用modelform组件实现
book_form_obj = BookFrom(book_obj.values()[0])
return render(request, 'edit_book.html', {
"book_form_obj":book_form_obj,
})