Django 如何预填充纯为ImageFields的内联表单集?

Django 如何预填充纯为ImageFields的内联表单集?,django,django-models,django-forms,django-templates,django-views,Django,Django Models,Django Forms,Django Templates,Django Views,我有两种型号:Profile和credentialage 我已经实现了inlineformsets,允许配置文件最多上载5个图像(CredentialImage) 目前,图像保存到数据库中,但当我重新访问更新表单时,它们不会预先填充,因此允许用户一次上传不限数量的照片5张。理想情况下,保存到数据库中的相同图像将预先填充到表单中,以限制配置文件一次只能拥有和编辑5张照片 根据我的理解,我需要将对象传递到页面以预填充信息,我相信我正是通过定义get\u object来做到这一点的 以下是两个模型:

我有两种型号:
Profile
credentialage

我已经实现了inlineformsets,允许配置文件最多上载5个图像(CredentialImage)

目前,图像保存到数据库中,但当我重新访问更新表单时,它们不会预先填充,因此允许用户一次上传不限数量的照片5张。理想情况下,保存到数据库中的相同图像将预先填充到表单中,以限制配置文件一次只能拥有和编辑5张照片

根据我的理解,我需要将对象传递到页面以预填充信息,我相信我正是通过定义
get\u object
来做到这一点的

以下是两个模型:

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, 
        related_name='credentialimage')
    image = models.ImageField(upload_to=credential_photo_upload_loc)  
inlineformset_工厂的modelforms+初始化:

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, max_num=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, self.request.FILES)
        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_data方法中提供一个实例

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, self.request.FILES, instance=self.object)
    else:
        context['credential_image'] = CredentialImageFormSet(instance=self.object)
    return context