Django imagefield无法通过ModelForm进行分配(Django imagefield can't assign via ModelForm)

我正在创建新的Contact实例,并且在cleaned_data['avatar'] contact = contact_form.save(commit=False) ,我看到默认的头像路径,但在表单中我设置了另一张图片。 这是为什么发生?

联系型号:

class Contact(models.Model): first_name = models.CharField(max_length=60) last_name = models.CharField(max_length=60) note = models.TextField(max_length=280, blank=True) avatar = models.ImageField(upload_to=generate_upload_to_path, default='/contacts/default_icon.png', blank=True) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None)

联系ModelForm:

class ContactForm(forms.ModelForm): prefix = 'contact' class Meta: model = Contact exclude = ('user',) def __init__(self, *args, **kwargs): super(ContactForm, self).__init__(*args, **kwargs) self.fields['last_name'].widget.attrs['placeholder'] = 'Last name' self.fields['first_name'].widget.attrs['placeholder'] = 'First name' self.fields['avatar'].widget.attrs['placeholder'] = 'Avatar'

views.py

def index(request): if request.user.is_authenticated: if request.method == 'POST': contact_form = ContactForm(request.POST) phone_number_form = PhoneNumberForm(request.POST) email_form = EmailForm(request.POST) if contact_form.is_valid() and phone_number_form.is_valid() and email_form.is_valid(): contact = contact_form.save(commit=False) contact.user = User.objects.get(pk=request.user.pk) contact.save() phone_number = phone_number_form.save(commit=False) phone_number.contact = contact phone_number.save() email = email_form.save(commit=False) email.contact = contact email.save() return redirect('contacts:index')

I'm creating new Contact instance and after contact = contact_form.save(commit=False) in cleaned_data['avatar'] i saw default avatar path, but in form i set another pic. Why is this happening?

Contact model:

class Contact(models.Model): first_name = models.CharField(max_length=60) last_name = models.CharField(max_length=60) note = models.TextField(max_length=280, blank=True) avatar = models.ImageField(upload_to=generate_upload_to_path, default='/contacts/default_icon.png', blank=True) user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=None)

Contact ModelForm:

class ContactForm(forms.ModelForm): prefix = 'contact' class Meta: model = Contact exclude = ('user',) def __init__(self, *args, **kwargs): super(ContactForm, self).__init__(*args, **kwargs) self.fields['last_name'].widget.attrs['placeholder'] = 'Last name' self.fields['first_name'].widget.attrs['placeholder'] = 'First name' self.fields['avatar'].widget.attrs['placeholder'] = 'Avatar'

views.py

def index(request): if request.user.is_authenticated: if request.method == 'POST': contact_form = ContactForm(request.POST) phone_number_form = PhoneNumberForm(request.POST) email_form = EmailForm(request.POST) if contact_form.is_valid() and phone_number_form.is_valid() and email_form.is_valid(): contact = contact_form.save(commit=False) contact.user = User.objects.get(pk=request.user.pk) contact.save() phone_number = phone_number_form.save(commit=False) phone_number.contact = contact phone_number.save() email = email_form.save(commit=False) email.contact = contact email.save() return redirect('contacts:index')

最满意答案

你必须包括request.FILES:

contact_form = ContactForm(request.POST, request.FILES)

docs: django文件上传

you must include request.FILES:

contact_form = ContactForm(request.POST, request.FILES)

docs: django file uploads

更多推荐