Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于Django类的UpdateView,具有多个上载文件的表单_Python_Django_Django Forms_Django Class Based Views_Multifile Uploader - Fatal编程技术网

Python 基于Django类的UpdateView,具有多个上载文件的表单

Python 基于Django类的UpdateView,具有多个上载文件的表单,python,django,django-forms,django-class-based-views,multifile-uploader,Python,Django,Django Forms,Django Class Based Views,Multifile Uploader,关于我目前面临的问题,我有两个问题: django中覆盖CreateView中的post方法是最佳实践吗?如果不是,您是否在CategoryFullForm或CreateView中编写了一个form\u有效函数,它看起来如何?CreateView目前工作得很好,但希望确保没有更好的方法来实现这一点 如果这是最佳实践,您将如何覆盖UpdateView中的get函数,以便能够编辑与正在上载的实例相关的文件,甚至添加其他文件?也可以通过其他方式完成这项任务 models.py ############

关于我目前面临的问题,我有两个问题:

  • django中覆盖CreateView中的post方法是最佳实践吗?如果不是,您是否在CategoryFullForm或CreateView中编写了一个form\u有效函数,它看起来如何?CreateView目前工作得很好,但希望确保没有更好的方法来实现这一点

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

  • models.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
    

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

    我认为,如果你把问题简化为模型的一般形式,你的回答会更成功。它们目前过于冗长。