我有两个模型:Profile
和CredentialImage
。
我正在尝试允许每个配置文件上传,最多可以上传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_data
和form_valid
特别警惕
尝试使用get_context_data
实例化formset并将其保存在form_valid
内是否正确?
答案 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
。