Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
这是将Django中的CreateView与inlineformset_工厂一起使用的正确方法吗?_Django - Fatal编程技术网

这是将Django中的CreateView与inlineformset_工厂一起使用的正确方法吗?

这是将Django中的CreateView与inlineformset_工厂一起使用的正确方法吗?,django,Django,我在文章和部分之间有一个主-细节关系,希望允许用户在创建文章之前在同一页面上添加部分 这似乎很有效,但我对Django也很陌生,不知道我是否做对了。这里发生了很多事情,我想知道我是否正确地重写了方法,例如,当我这样做时,内容是否正确 一个黄金标准的做法将是非常感激 class ArticleCreateView(LoginRequiredMixin,CreateView): template_name = 'articles/article_add.html' model = A

我在文章和部分之间有一个主-细节关系,希望允许用户在创建文章之前在同一页面上添加部分

这似乎很有效,但我对Django也很陌生,不知道我是否做对了。这里发生了很多事情,我想知道我是否正确地重写了方法,例如,当我这样做时,内容是否正确

一个黄金标准的做法将是非常感激

class ArticleCreateView(LoginRequiredMixin,CreateView):
    template_name = 'articles/article_add.html'
    model = Article
    form_class = ArticleForm
    success_url = reverse_lazy('index')
    SectionFormSet = inlineformset_factory(Article, Section, extra=2, can_delete=False, fields=('content',))

    def get(self, request, *args, **kwargs):
        print('get called on article create view')
        self.object = None   #what does this achieve?
        
        return self.render_to_response(
            self.get_context_data(form=self.get_form(),
                                  section_form=self.SectionFormSet(),
                                  ))

    def post(self, request, *args, **kwargs):
        print('post called on article create view')
        self.object = None
     
        form = self.get_form()
        section_form = self.SectionFormSet(self.request.POST)
        
        if (form.is_valid() and section_form.is_valid()):
            return self.form_valid(form, section_form)
        else:
            return self.form_invalid(form, section_form)

    
    def form_valid(self, form, section_form):
        form.instance.author = self.request.user
        if section_form.is_valid():
            print('section form is valid')
            self.object = form.save()
            section_form.instance = self.object
            section_form.save()
        return HttpResponseRedirect(self.success_url)    
        #return super().form_valid(form)
        
        '''
            return self.render_to_response( self.get_context_data(form=form,
                                  section_form=section_form,
                                  ))
        '''
    

    def form_invalid(self, form, article_form):
        return self.render_to_response(
            self.get_context_data(form=form,
                                  article_form=article_form))

我不知道这是否100%正确,但它似乎比我以前的代码要好:

class ArticleCreateView(LoginRequiredMixin,CreateView):
    template_name = 'articles/article_add.html'
    form_class = ArticleForm
    SectionFormSet = inlineformset_factory(Article, Section, extra=2, can_delete=False, fields=('content',))

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.request.POST:
            context['section_form'] = self.SectionFormSet(self.request.POST,instance=self.object)
        else:
            context['section_form'] = self.SectionFormSet(instance=self.object)
        return context

    def save_sections(self):
        try:
            context = self.get_context_data()
            section_form = context['section_form']
            if section_form.is_valid():
                #section_form.instance = self.object
                section_form.save()
        except Exception as e:
            print('failed to save section: ' + str(e))


    def form_valid(self, form):
        form.instance.author = self.request.user
        response = super().form_valid(form) #save article form 
        self.save_sections()
        return response

    def get_success_url(self):
        return reverse_lazy('index')
这里是更新视图(用于完成),除了在formset工厂中获取文章的实例外,几乎完全相同

class ArticleUpdateView(LoginRequiredMixin,UserPassesTestMixin,UpdateView):
    template_name = 'articles/ArticleUpdate.html'
    form_class = ArticleForm
    model = Article
    SectionFormSet = inlineformset_factory(Article, Section, extra=0, can_delete=False, fields=('content',))

    def test_func(self):
        article = self.get_object()
        
        if self.request.user == article.author or self.request.user.is_superuser :
            return True
        else:
            return False


    def get_context_data(self, **kwargs):
        print('get context data called update view')
        context = super().get_context_data(**kwargs)
        if self.request.POST:
            context['section_form'] = self.SectionFormSet(self.request.POST,instance=self.object)
        else:
            context['section_form'] = self.SectionFormSet(instance=self.object)
        return context

    def save_sections(self):
        print('save sections called update view')
        try:
            context = self.get_context_data()
            section_form = context['section_form']
            if section_form.is_valid():
               # section_form.instance = self.object  #if im passing instance in the factory, do I need it here to?
                section_form.save()
        except Exception as e:
            print('failed to save section: ' + str(e))


    def form_valid(self, form):
        print('form valid called update view')
        form.instance.author = self.request.user
        response = super().form_valid(form) #save article form 
        self.save_sections()
        return response

    def get_success_url(self):
        return reverse_lazy('index')


我不知道这是否100%正确,但它似乎比我以前的代码要好:

class ArticleCreateView(LoginRequiredMixin,CreateView):
    template_name = 'articles/article_add.html'
    form_class = ArticleForm
    SectionFormSet = inlineformset_factory(Article, Section, extra=2, can_delete=False, fields=('content',))

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.request.POST:
            context['section_form'] = self.SectionFormSet(self.request.POST,instance=self.object)
        else:
            context['section_form'] = self.SectionFormSet(instance=self.object)
        return context

    def save_sections(self):
        try:
            context = self.get_context_data()
            section_form = context['section_form']
            if section_form.is_valid():
                #section_form.instance = self.object
                section_form.save()
        except Exception as e:
            print('failed to save section: ' + str(e))


    def form_valid(self, form):
        form.instance.author = self.request.user
        response = super().form_valid(form) #save article form 
        self.save_sections()
        return response

    def get_success_url(self):
        return reverse_lazy('index')
这里是更新视图(用于完成),除了在formset工厂中获取文章的实例外,几乎完全相同

class ArticleUpdateView(LoginRequiredMixin,UserPassesTestMixin,UpdateView):
    template_name = 'articles/ArticleUpdate.html'
    form_class = ArticleForm
    model = Article
    SectionFormSet = inlineformset_factory(Article, Section, extra=0, can_delete=False, fields=('content',))

    def test_func(self):
        article = self.get_object()
        
        if self.request.user == article.author or self.request.user.is_superuser :
            return True
        else:
            return False


    def get_context_data(self, **kwargs):
        print('get context data called update view')
        context = super().get_context_data(**kwargs)
        if self.request.POST:
            context['section_form'] = self.SectionFormSet(self.request.POST,instance=self.object)
        else:
            context['section_form'] = self.SectionFormSet(instance=self.object)
        return context

    def save_sections(self):
        print('save sections called update view')
        try:
            context = self.get_context_data()
            section_form = context['section_form']
            if section_form.is_valid():
               # section_form.instance = self.object  #if im passing instance in the factory, do I need it here to?
                section_form.save()
        except Exception as e:
            print('failed to save section: ' + str(e))


    def form_valid(self, form):
        print('form valid called update view')
        form.instance.author = self.request.user
        response = super().form_valid(form) #save article form 
        self.save_sections()
        return response

    def get_success_url(self):
        return reverse_lazy('index')