使用基于类的视图进行表单处理


当前第2页 返回上一页

的urls.py 

from django.urls import path
from myapp.views import AuthorCreate, AuthorDelete, AuthorUpdate
?
urlpatterns = [
  # ...
  path('author/add/', AuthorCreate.as_view(), name='author-add'),
  path('author/<int:pk>/', AuthorUpdate.as_view(), name='author-update'),
  path('author/<int:pk>/delete/', AuthorDelete.as_view(), name='author-delete'),
]

注意:些观点继承 SingleObjectTemplateResponseMixin 它使用 template_name_suffix 了构建 template_name 基于模型。

在此示例中:

  • CreateView和UpdateView使用myapp/author_form.html
  • DeleteView 用途 myapp/author_confirm_delete.html

如果希望为CreateView和 提供单独的模板UpdateView,则可以 在视图类上设置 template_name或 template_name_suffix。

模型和request.user

要跟踪使用创建对象的用户,CreateView可以使用自定义方法ModelForm来执行此操作。首先,将外键关系添加到模型:

models.py中

from django.contrib.auth.models import User
from django.db import models
?
class Author(models.Model):
  name = models.CharField(max_length=200)
  created_by = models.ForeignKey(User, on_delete=models.CASCADE)
?
  # ...

在视图中,确保您不包括created_by要编辑的字段列表,并覆盖 form_valid()以添加用户:

的views.py 

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView
from myapp.models import Author
?
class AuthorCreate(LoginRequiredMixin, CreateView):
  model = Author
  fields = ['name']
?
  def form_valid(self, form):
      form.instance.created_by = self.request.user
      return super().form_valid(form)

LoginRequiredMixin防止未登录的用户访问表单。如果您忽略了这一点,则需要处理中的未授权用户form_valid()。

AJAX示例

这是一个示例,显示了如何实现适用于AJAX请求以及“普通”表单POST的表单:

from django.http import JsonResponse
from django.views.generic.edit import CreateView
from myapp.models import Author
?
class AjaxableResponseMixin:
  """
  Mixin to add AJAX support to a form.
  Must be used with an object-based FormView (e.g. CreateView)
  """
  def form_invalid(self, form):
      response = super().form_invalid(form)
      if self.request.is_ajax():
          return JsonResponse(form.errors, status=400)
      else:
          return response
?
  def form_valid(self, form):
      # We make sure to call the parent's form_valid() method because
      # it might do some processing (in the case of CreateView, it will
      # call form.save() for example).
      response = super().form_valid(form)
      if self.request.is_ajax():
          data = {
              'pk': self.object.pk,
          }
          return JsonResponse(data)
      else:
          return response
?
class AuthorCreate(AjaxableResponseMixin, CreateView):
  model = Author
  fields = ['name']

详情参考: https://docs.djangoproject.com/en/3.0/



标签:Django

返回前面的内容

相关阅读 >>

Django 模型

基于类的视图简介

Django 安装

基于类的视图

使用asgi进行部署

使用基于类的视图进行表单处理

将mixins与基于类的视图一起使用

Django 创建第一个项目

Django 使用表单模板

Django 的性能与优化

更多相关阅读请进入《Django》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...