Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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 在通用更新视图中使用内联表单集通过外键编辑相关对象_Django_Inline Formset - Fatal编程技术网

Django 在通用更新视图中使用内联表单集通过外键编辑相关对象

Django 在通用更新视图中使用内联表单集通过外键编辑相关对象,django,inline-formset,Django,Inline Formset,从django文档中可以清楚地看到 但是,如果按照文档中的一个示例,您希望通过Authors通用更新视图编辑与作者相关的书籍,该怎么办 以下方面是否有更好的或替代方法: 创建其他表单集,并将其添加到通用更新视图的get_context_data()方法中的上下文中 在通用更新视图的form_valid()方法中处理这个额外的表单集-检查它是否有效,并保存或更新上下文,如果无效则返回 models.py from django.db import models class Author(mode

从django文档中可以清楚地看到

但是,如果按照文档中的一个示例,您希望通过Authors通用更新视图编辑与作者相关的书籍,该怎么办

以下方面是否有更好的或替代方法:

  • 创建其他表单集,并将其添加到通用更新视图的get_context_data()方法中的上下文中
  • 在通用更新视图的form_valid()方法中处理这个额外的表单集-检查它是否有效,并保存或更新上下文,如果无效则返回
  • models.py

    from django.db import models
    
    class Author(models.Model):
        name = models.CharField(max_length=100)
    
    class Book(models.Model):
        author = models.ForeignKey(Author, on_delete=models.CASCADE)
        title = models.CharField(max_length=100)
    
    views.py

    class AuthorUpdate(UpdateView):
        model = Author
        fields = '__all__'
    
        def get_context_data(self, **kwargs):
            data = super(AuthorUpdate, self).get_context_data(**kwargs)
            BooksFormSet = inlineformset_factory(Author, Book, fields='__all__', extra=1)
    
            if self.request.POST:
                # Create a formset instance to edit an existing model object,
                # but use POST data to populate the formset.
                data['books'] = BooksFormSet(self.request.POST, instance=self.get_object())
            else:
                # Create a formset with the data from model object and add it to context
                data['books'] = BooksFormSet(instance=self.get_object())
            return data
    
        def form_valid(self, form):
            context = self.get_context_data()
            books = context['books']
            with transaction.atomic():
                self.object = form.save()
    
                if books.is_valid():
                    books.instance = self.object
                    books.save()
                else:
                    context.update({'books': books})
                    return self.render_to_response(context)
    
            return super(AuthorUpdate, self).form_valid(form)