为什么不保存inlineformset_factory的图像?

时间:2017-11-06 10:00:17

标签: django django-models django-forms django-templates django-views

我有两个模型:ProfileCredentialImage

我正在尝试允许每个配置文件上传,最多可以上传5个最大图像(CredentialImage) 我已经决定对图像使用inlineformset_factory,因为在UpdateView上,用户可以选择更新他们的一般配置文件信息以及他们的5个选择图像。

代码没有错误,但图像不保存到数据库。

以下是两种模式:

class Profile(models.Model):
    ...
    def get_absolute_url(self):
        return reverse("profile:profile_detail",
                       kwargs={"username": self.user})

class CredentialImage(models.Model):
    profile = models.ForeignKey(Profile, default=None)
    image = models.ImageField(upload_to=credential_photo_upload_loc)  

informformset_factory的模型形式+初始化:

from django.forms.models import inlineformset_factory

class ProfileUpdateForm(ModelForm):
    class Meta:
        model = Profile
        fields = [
            "introduction",
            "biography",
        ]

class CredentialImageForm(ModelForm):
    image = ImageField()

    class Meta:
        model = CredentialImage
        fields = ['image', ]

CredentialImageFormSet = inlineformset_factory(Profile,
    CredentialImage, fields=('image', ), extra=4)  

用于更新个人资料的基于类的UpdateView:

class ProfileUpdateView(LoginRequiredMixin, UpdateView):
    form_class = ProfileUpdateForm
    template_name = 'profile/profile_edit.html'

    def get_context_data(self, **kwargs):
        context = super(ProfileUpdateView, self).get_context_data(**kwargs)
        if self.request.POST:
            context['credential_image'] = CredentialImageFormSet(self.request.POST)
        else:
            context['credential_image'] = CredentialImageFormSet()
        return context

    def get_object(self, *args, **kwargs):
        user_profile = self.kwargs.get('username')
        obj = get_object_or_404(Profile, user__username=user_profile)
        return obj

    def form_valid(self, form):    
        data = self.get_context_data()
        formset = data['credential_image']
        if formset.is_valid():
            self.object = form.save()
            formset.instance = self.object
            formset.save()
            return redirect(self.object.get_absolute_url())

        instance = form.save(commit=False)
        instance.user = self.request.user
        return super(ProfileUpdateView, self).form_valid(form)

我对get_context_dataform_valid特别警惕 尝试使用get_context_data实例化formset并将其保存在form_valid内是否正确?

1 个答案:

答案 0 :(得分:2)

上传文件时,您需要将request.FILES传递给formset以及request.POST

context['credential_image'] = CredentialImageFormSet(self.request.POST, self.request.FILES)

get_context_data方法用于获取数据的上下文。您不应该在那里实例化formset。您可以查看来自django-extra-views的UpdateWithInlinesView