基于 Django 类的 UpdateView 以及用于多个上传文件的表单

2023-11-30

针对我目前面临的问题,我有两个问题:

  1. django 中的最佳实践是覆盖 CreateView 中的 post 方法吗?如果不是,您是否在 CategoryFullForm 或 CreateView 中编写 form _valid 函数,它会是什么样子? CreateView 目前效果很好,但希望确保没有更好的方法来做到这一点。

  2. 如果这是最佳实践,您将如何覆盖 UpdateView 中的 get 函数,以便能够编辑与正在上传的实例相关的文件,甚至添加其他文件?也可以采用其他方式来完成这项任务。

模型.py

############ CATEGORY MODEL ################
class Category(models.Model):
    category_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100, null=True, blank=True)
    est_pr_sqft = models.FloatField(blank=True)
    est_duration = models.IntegerField(blank=True)
    preceding_job = models.CharField(max_length=100, blank=True)
    category_notes = models.CharField(max_length=250, blank=True)
    category_slug = models.SlugField(max_length=100, unique=True, null=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    date_posted = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('category-detail', kwargs={'slug': self.category_slug})

    def save(self, *args, **kwargs):
        if not self.category_slug:
            self.category_slug = slugify(self.name)
        return super().save(*args, **kwargs)

class CategoryFiles(models.Model):
    category_id = models.ForeignKey(Category, on_delete=models.CASCADE)
    document = models.FileField(upload_to="attachments",null=True,blank=True)
    uploaded_date = models.DateTimeField(auto_now_add=True)
    modified_date = models.DateTimeField(auto_now=True)

    def delete(self, *args, **kwargs):
        self.document.delete()
        return super().delete(*args, **kwargs)

forms.py

class CategoryForm(forms.ModelForm):

    class Meta:
        model = Category
        fields = ['name', 'est_pr_sqft', 'est_duration', 'preceding_job', 'category_notes']

class CategoryFullForm(CategoryForm):

    files = forms.FileField(widget=forms.ClearableFileInput(attrs={'multiple': True}),required=False)

    class Meta(CategoryForm.Meta):
        fields = CategoryForm.Meta.fields + ['files']

views.py

####### CATEGORY VIEWS ########

class CategoryListView(LoginRequiredMixin, ListView):
    model = Category
    template_name = 'ProjectManagementApp/PM-Category-List.html'
    context_object_name = 'categories'
    slug_field = 'project_slug'
    success_url = reverse_lazy('Category-list')

class CategoryDetailView(LoginRequiredMixin, DetailView):
    model = Category
    template_name = 'ProjectManagementApp/PM-Category-Detail.html'
    slug_field = 'category_slug'

    def get_context_data(self, **kwargs):
        context = super(CategoryDetailView, self).get_context_data(**kwargs)
        context['files'] = CategoryFiles.objects.all()
        #context['photos'] = CategoryPhotos.objects.all()
        return context

class CategoryCreateView(LoginRequiredMixin, CreateView):
    model = Category
    form_class = CategoryFullForm
    template_name = 'ProjectManagementApp/PM-Category-Create.html'  # Replace with your template.
    #success_url = reverse_lazy('category-detail')
    slug_field = 'category_slug'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('files')
        if form.is_valid():
            author = request.user
            name = form.cleaned_data['name']
            est_pr_sqft = form.cleaned_data['est_pr_sqft']
            est_duration = form.cleaned_data['est_duration']
            preceding_job = form.cleaned_data['preceding_job']
            category_notes = form.cleaned_data['category_notes']
            category_obj = Category.objects.create(name=name,est_pr_sqft=est_pr_sqft,est_duration=est_duration,preceding_job=preceding_job,category_notes=category_notes,author=author)
            for f in files:
                CategoryFiles.objects.create(category_id=category_obj,document=f)

            return HttpResponseRedirect(reverse_lazy('Category-list'))
        else:
            return self.form_invalid(form)

class CategoryUpdateView(LoginRequiredMixin, UpdateView): #UserPassesTestMixin - makes sure user who made entry is only one who can update it.
    model = Category
    form_class = CategoryFullForm
    template_name = 'ProjectManagementApp/PM-Category-Create.html'  # Replace with your template.
    slug_field = 'category_slug'
    success_url = reverse_lazy('Category-list')

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('files')
        if form.is_valid():
            author = request.user
            name = form.cleaned_data['name']
            est_pr_sqft = form.cleaned_data['est_pr_sqft']
            est_duration = form.cleaned_data['est_duration']
            preceding_job = form.cleaned_data['preceding_job']
            category_notes = form.cleaned_data['category_notes']
            category_obj = Category.objects.create(name=name,est_pr_sqft=est_pr_sqft,est_duration=est_duration,preceding_job=preceding_job,category_notes=category_notes,author=author)
            for f in files:
                CategoryFiles.objects.create(category_id=category_obj,document=f)

            return HttpResponseRedirect(reverse_lazy('Category-list'))
        else:
            return self.form_invalid(form)
#
#    #Doesnt allow you to update other users post
#    #def test_func(self):
#    #    project = self.get_object()
#    #    if self.request.user == post.author:
#    #        return True
#    #    return False
#
#
    def form_valid(self,form):
        form.instance.author = self.request.user
        return super().form_valid(form)

class CategoryDeleteView(LoginRequiredMixin, DeleteView): #UserPassesTestMixin - makes sure user who made entry is only one who can update it.
    model = Category
    template_name = 'ProjectManagementApp/PM-Category-Delete.html'
    slug_field = 'category_slug'
    success_url = reverse_lazy('Category-list')


    #Doesnt allow you to delete other users post
    #def test_func(self):
    #    project = self.get_object()
    #    if self.request.user == post.author:
    #        return True
    #    return False

如果需要 urls.py/admin.py 我很乐意提供,但我认为不需要它们,以及任何 html 文件。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于 Django 类的 UpdateView 以及用于多个上传文件的表单 的相关文章

随机推荐

  • sqoop 与 mysql 的导入问题

    我有一个基于 cdh5 的 hadoop ha 设置 我尝试使用 sqoop 从 mysql 导入表失败 并出现以下错误 15 03 20 12 47 53 ERROR manager SqlManager Error reading fr
  • 空格上仅支持 JavaScript 的自动换行功能?

    我发现的大多数自动换行功能都绑定到 css 和 或浏览器 dom 我正在 javascript 环境 rhino 中工作 需要找到或设计一个更好的自动换行 该换行可以在给定行长度值之前的空白处中断 我当前的解决方案只是搜索给定字符之前的最后
  • C++ 中如何进行柯里化?

    什么是柯里化 C 中如何进行柯里化 请解释一下STL容器中的活页夹 1 什么是柯里化 柯里化只是意味着将多个参数的函数转换为单个参数的函数 使用一个例子可以很容易地说明这一点 取一个函数f它接受三个参数 int f int a std st
  • 解决 pex 内部类

    当被测试的类是内部类时 有什么方法可以让 pex 工作吗 密封课程怎么样 我的意思是 毕竟这种类型的工具非常适合 API 测试 有时您可能希望至少将内容保留在内部 Thanks 通过以下方式为测试组件提供内部可见性InternalsVisi
  • 有没有办法模糊匹配或提供分数作为行值应与哪个 ID 或组关联的假设?

    我有一个看起来像这样的数据集 structure list ID c 1 2 3 4 5 6 7 8 9 10 Date c 2020 01 n04 2020 04 03 2020 12 10 2020 09 12 2020 11 19 2
  • 在运行时修改函数(拉出局部变量)

    想象一下这个简单的函数创建变量的修改值default modified default 0 def modify modified default 1 print modified replace with OS call I can t
  • 从单词列表中提取所有匹配的关键字并创建一个新的数据框 pandas [重复]

    这个问题在这里已经有答案了 我想从意见列中提取所有匹配的关键字 如果它们与关键字列表中的单词匹配 则在新列中打印所有匹配的单词 包括重复的单词 当前代码仅提取第一个匹配的单词 不包含重复的单词 import pandas as pd df
  • 作为 Maven 构建过程的一部分运行量角器测试

    我有一个 Maven 项目 我不想更改 POM 以便当我构建项目 Clean Install 时 在编译部分之后 将启动一组量角器测试 打开 selenium 并做几件事 并且仅如果测试通过 则构建本身也通过 我似乎找不到能为我提供这种功能
  • R 计算 for 循环中的平均值

    我有我的代码 V max 10 V min 0 n 1 H 1 C c 0 0 01 0 1 1 par mfrow c length C 1 1 mar c 2 0 2 0 oma c 1 5 0 0 V lt function C H
  • 桌面 DLL 中的 Prism PopupChildWindowAction 缺失

    我正在尝试在 WPF Prism 桌面应用程序中实现模式对话框 从 Prism 指导中我可以看到正确的方法应该是使用交互
  • Xamarin Forms - 在运行时翻译抽屉菜单项

    我正在遵循优秀的教程 Link 关于 Xamarin Forms 中的多语言 一切正常 但我有一个问题 在我的应用程序中 我使用 Syncfusion 的导航抽屉 因为我在 ListView 中生成菜单项 如下所示 DrawerPage x
  • 批处理脚本未按预期分配变量

    我正在编写一个批处理脚本 它将分配一个变量字符串 然后修剪它 我面临两个问题 变量分配不正确 它从变量文件中获取最后一个值 我第一次运行脚本时未分配变量 我需要第二次运行脚本以查看变量是否已分配 在第三次运行时 我可以看到修剪正在起作用 我
  • 将数据帧中的字符转换为时间戳

    我在数据框中有一个被识别为字符类的时间戳 由于某种原因 我无法将其转换为 poxis 时间戳 这是数据示例 ID dateTime stage 1 2016 11 01T00 00 00 000Z 4 82 2 2016 11 01T00
  • 如何使 Text::slug() 正确转换德语变音符号?

    我正在使用 CakePHP 3 6 当我使用带有德语变音符号的单词时 例如 Text slug Grundst cke 我会得到 Grundstucke 其中 u 但这是不正确的 我应该得到 Grundstuecke 其中 ue 是否有一个
  • 将整数数组传递给 ASP.NET Web API?

    我有一个 ASP NET Web API 版本 4 REST 服务 我需要在其中传递一个整数数组 这是我的操作方法 public IEnumerable
  • 多个 Mat Paginator 无法在 Angular 组件中工作

    我有三个不同的 div Post Todo User 根据用户选择我显示不同的表格 例如 默认情况下Post部分加载表100 records 如果用户选择Todo部分 表格应显示Todo记录等带有分页 I ve three datasour
  • R tableGrob 更改行的格式

    我有一些相对简单的代码来创建用于打印到 PDF 的表格 library gridExtra df lt head iris tableGrob df gp gpar fontsize 8 rows NULL 我想让最后一行的格式与标题行相同
  • 使用 Windows 批处理文件的单行多个命令

    我尝试了解批处理文件中单个命令行中的多个命令如何工作 dir md folder1 rename folder1 mainfolder 和其他具有类似命令的情况 但是 替换为 dir md folder1 rename folder1 ma
  • 为什么 Microsoft Azure(或一般的 Swift)无法更新变量以在表查询后返回?

    我一直在关注微软Azure文档成功查询表 将项目插入 读取和更新到数据库中工作正常 但在一个简单的方法结束时 立即关闭文档 func getAllEventIDs gt String var events String this is to
  • 基于 Django 类的 UpdateView 以及用于多个上传文件的表单

    针对我目前面临的问题 我有两个问题 django 中的最佳实践是覆盖 CreateView 中的 post 方法吗 如果不是 您是否在 CategoryFullForm 或 CreateView 中编写 form valid 函数 它会是什