0%

django类视图

说明

  • 上一篇文章django-admin 主要介绍了利用admin创建用户,然后结合模板、html等实现了增删改查,本次介绍使用类视图来优化

登录的优化

  • 根目录的url,用系统自带的视图
1
2
3
4
5
6
7
urlpatterns = [
path('admin/', admin.site.urls),
path('accounts/logout/', LogoutView.as_view(next_page='/login/'), name='logout'),
path('accounts/login/', LoginView.as_view(template_name='login.html'), name='login'),

]

  • setting加入了登录、退出登录的url
1
2
3
4
5
6
7
8
# 指定登录URL
LOGIN_URL = '/accounts/login/'

# 指定注销后重定向的URL
LOGOUT_REDIRECT_URL = '/login/'

# 指定登录后重定向的URL
LOGIN_REDIRECT_URL = '/book/'

书籍列表

  • 看下应用下的url优化
1
2
3
4
5
6
7
urlpatterns = [
path('book/', BookList.as_view(), name='book_list'),
path('book/add/', BookAdd.as_view(), name='book_add'),
path('book/edit/<int:pk>/', BookEdit.as_view(), name='book_edit'),
path('book/<int:pk>/', BookDetail.as_view(), name='book_detail'),
path('book/delete/<int:pk>/', BookDelete.as_view(), name='book_delete'), # 新增删除路径
]
  • vew代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
lass BookList(LoginRequiredMixin, ListView):
model = Book
template_name = 'index.html'
context_object_name = 'latest_book_list'
paginate_by = 5

def get_queryset(self):
title = self.request.GET.get("title", "")
if title:
return Book.objects.filter(title__contains=title).order_by("-pub_date")
else:
return Book.objects.order_by("-pub_date")

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['search_term'] = self.request.GET.get("title", "")
return context
  • 使用了LoginRequiredMixin登录视图
  • get_queryset 返回列表,get_context_data返回具体字段

新增书籍

  • 具体view代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14

class BookAdd(LoginRequiredMixin, CreateView):
model = Book
# fields = ['title', 'price']
form_class = BookForm

template_name = 'add.html'
success_url = reverse_lazy('book_list')
# 默认实现了 form_valid() 简单重定向至 success_url
def form_valid(self, form):
book = form.save(commit=False)
book.pub_date = now().strftime("%Y-%m-%d")
book.save()
return super().form_valid(form)
  • html文件
1
2
3
4
5
6
7
8
9
10
11
12
{% extends "base_generic.html" %}

{% block content %}
<h2>Add New Book</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save changes</button>
</form>
<a href="{% url 'book_list' %}">Back to list</a>
{% endblock %}

  • form.as_p 直接根据BookForm 生成了表单内容

  • url进行了修改,之前是跳转到add的html界面,然后提交form表单,现在可以一步完成

1
2
# path('event/add/', EventAdd.as_view(), name='event_add'),
path('book/add/', BookAdd.as_view(), name='book_add'),

删除

1
2
3
4
5
6
7
8
9
10
11
12
13
lass BookDelete(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
"""
权限控制:UserPassesTestMixin 允许你在视图级别进行自定义权限检查。
"""
model = Book
template_name = 'delete.html'
success_url = reverse_lazy('book_list')
# test_func: 这是 UserPassesTestMixin 要求实现的方法,用于定义具体的权限检查逻辑。如果 test_func 返回 True,则允许用户访问视图;否则,返回 False 并抛出 PermissionDenied 异常。
def test_func(self):
book = self.get_object()
# 确保只有书籍的所有者或管理员才能删除书籍
return self.request.user.is_superuser or self.request.user == book.owner

编辑

  • view
1
2
3
4
5
6
7
8
9
10
11
12
class BookEdit(LoginRequiredMixin, UpdateView):
model = Book
form_class = BookForm

template_name = 'edit.html'
success_url = reverse_lazy('book_list')

def form_valid(self, form):
book = form.save(commit=False)
book.pub_date = now().strftime("%Y-%m-%d")
book.save()
return super().form_valid(form)
  • html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>编辑</title>
</head>
<body>
{% extends "base_generic.html" %}

{% block content %}
<h2>Edit Book</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Save changes</button>
</form>
<a href="{% url 'book_list' %}">Back to list</a>
{% endblock %}

</body>
</html>