模型实例参考上一篇DetailView的讲解
forms.py
class ContactForm(forms.Form):
name = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
1.FormView
from django.views.generic.edit import FormView
from .forms import ContactForm
class ContactView(FormView):
"""
FormMixin类
显示表单的视图。错误时,重新显示带有验证错误的表格;成功后,重定向到新的URL。
"""
template_name = 'contact.html'
form_class = ContactForm # form表单类
success_url = '/book/book_list/'
initial = {"name": 'hy'} # 为表单设置默认值
prefix = '123' # 一般用于同一Form区别namespace用,设置后id字段,label的for字段改变
def form_valid(self, form):
form.send_email()
return super().form_valid(form)
html:
<body>
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Send message">
</form>
</body>
页面效果:
2.CreateView
一个视图,该视图显示用于创建对象的表单,重新显示带有验证错误的表单(如果存在)并保存该对象。
views.py
class BookCreate(CreateView):
"""
由于父类都继承了FormMixin,TemplateResponseMixin,因此很多的方法,属性都相同
"""
template_name = 'book4.html'
model = Book
fields = ['name', 'author', 'book_type', 'add_time']
# form_class = BookModelForm 通过form_class可以设置自定义内容,包括label,help_texts,error_message等,但是form_class与fieldsz不能同时存在
success_url = '/book/book_list/'
<body>
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Save">
</form>
</body>
页面效果:
3.UpdateView
作用:该视图显示用于编辑现有对象的表单,重新显示带有验证错误的表单(如果有)并保存对对象的更改。这将使用从对象的模型类自动生成的表单(除非手动指定了表单类)
views
class BookUpdate(UpdateView):
"""
该类必须要有一个pk或者slug来查询(会调用self.object = self.get_object())
"""
model = Book
fields = ['name']
# template_name_suffix = '_update_form' # html文件后缀
template_name = 'book_update_form.html'
success_url = '/book/book_list/' # 修改成功后跳转的链接
html:
<body>
<form method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Update">
</form>
</body>
效果:
urls.py
path('book_update/<int:pk>', BookUpdate.as_view()),
4.DeleteView
作用:显示确认页面并删除现有对象的视图。如果请求方法为POST,则只会删除给定的对象。如果通过来获取此视图的请求为GET,它将显示一个确认页面,该页面应包含一个张贴到相同URL的表单。
views
from django.urls import reverse_lazy # 带参数跳转
class BookDelete(DeleteView):
"""
"""
model = Book
template_name = 'book_delete.html'
# template_name_field = ''
# template_name_suffix = ''
# book_delete.html为models.py中__str__的返回值
# namespace:url_name
success_url = reverse_lazy('book:book_list')
html:
<body>
<form method="post">{% csrf_token %}
<p>Are you sure you want to delete "{{ object }}"?</p>
<input type="submit" value="Confirm">
</form>
</body>
urls
path('book_delete/<int:pk>', BookDelete.as_view()),
效果:
评论列表
已有1条评论
test
测试