Python 将formset与ContentType一起使用

Python 将formset与ContentType一起使用,python,django,view,formsets,Python,Django,View,Formsets,对于由表单和表单集组成的视图,使用UpdateView时遇到问题 我有以下模型:项目和图片 图片定义为: class Picture(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=255, blank=False) content_type = models.ForeignKey(ContentType, verbose_name="c

对于由表单和表单集组成的视图,使用UpdateView时遇到问题

我有以下模型:项目和图片

图片定义为:

class Picture(models.Model):

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, blank=False)

    content_type = models.ForeignKey(ContentType, verbose_name="content type",
                related_name="content_type_set_for_%(class)s")
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey("content_type", "object_id")
我有几个包含图片的模型。例如,在项目模型中:

class Item(models.Model):

    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, blank=False)
    pictures = generic.GenericRelation(Picture)
我有以下ItemCreateForm:

class ItemCreateForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(ItemCreateForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Item
图片格式:

class PictureForm(forms.ModelForm):

    id  = forms.IntegerField(widget=forms.HiddenInput)

    def __init__(self, *args, **kwargs):
        super(PictureForm, self).__init__(*args, **kwargs)

    def save(self):
         data = self.cleaned_data
         obj = Picture(**data);
         # do something to obj
         # obj.save() 

    class Meta:
        model = Picture
        fields = ['id', 'name']
以及以下观点:

class ItemUpdateView(UpdateView):
    form_class = ItemCreateForm
    template_name = 'item/new.html'
    model = Item
    success_url = '/items/'

    def get_context_data(self, **kwargs):
        context = super(ItemUpdateView, self).get_context_data(**kwargs)
        item = context['object']

        # Dont' create any extra forms when showing an update view
        PictureFormSet = formset_factory(PictureForm, extra=0)

        return {'form': kwargs['form'],
                'picture_formset': UploadFormSet(initial = [ model_to_dict(a) for pic in item.pictures.all()])}

    def post(self, request, *args, **kwargs):

       self.object = self.get_object()

       item_form = ItemCreateForm(request.POST, instance=self.object)

       if item_form.is_valid():
           item = item_form.save(commit=False)
           item.save()

           # How do update the pictures?
这是我的URL.py:

url(r'^items/(?P<pk>\d+)/update/$', ItemUpdateView.as_view(), name='item_update')
是的,有,请检查此[[1]:
<form action="" method="post" enctype="multipart/form-data">

{% for field in form %}
    # do something
{% endfor %}


{{ picture_formset.management_form }}
{% for form in picture_formset.forms %}
    # do something
{% endfor %}

<input  name="commit" type="submit" value="Submit" />
</form>
PictureFormSet = formset_factory(PictureForm)
picture_formset = PictureFormSet(request.POST, request.FILES)

for picture_form in picture_formset.forms:
      picture_form.save()