Django - modelform不保存图像
我使用Ubuntu 14.10和apache2 web服务器。在我的Django项目我有关于用户的附加信息模型:Django - modelform不保存图像
class UserProfile(models.Model):
class Meta:
verbose_name_plural = u'User profile'
user = models.OneToOneField(User)
birthday = models.DateField(blank=True, null=True)
avatar = models.ImageField(upload_to='media/profile/avatar', blank=True, null=True)
name = models.CharField(blank=True, null=True, max_length=20)
surname = models.CharField(blank=True, null=True, max_length=50)
phone = models.CharField(blank=True, null=True, max_length=12)
def __unicode__(self):
return '%s' % self.user
这里是我的形式:
class ExtraProfileDataForm(ModelForm):
name = forms.CharField(label=(u'Enter your name'))
surname = forms.CharField(label=(u'Enter your surname'))
phone = forms.CharField(label=(u'Enter your phone'))
birthday = forms.DateField(label=(u'Birthday'))
avatar = forms.ImageField(label=(u'Avatar'))
class Meta:
model = UserProfile
fields = ('name', 'surname', 'phone', 'birthday', 'avatar')
def __init__(self, *args, **kwargs):
super(ExtraProfileDataForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
而且本所认为:
@login_required
def UserFullDataForm(request):
if request.method == 'POST':
form = ExtraProfileDataForm(request.POST)
if form.is_valid():
profile_user = request.user
user_profile, created = UserProfile.objects.get_or_create(user=profile_user)
user_profile.name = form.cleaned_data['name']
user_profile.surname = form.cleaned_data['surname']
user_profile.phone = form.cleaned_data['phone']
user_profile.birthday = form.cleaned_data['birthday']
user_profile.avatar = form.cleaned_data['avatar']
user_profile.save()
return HttpResponseRedirect('/profile/')
else:
return render(request, 'profiles/extra_profile.html', {'form':form})
else:
form = ExtraProfileDataForm()
context = {'form':form}
return render (request, 'profiles/extra_profile.html', context)
当我填写形成保存到数据库的所有字段,但图像字段除外。 media/profile/avatar
文件夹的文件名为www-data
,chmod为775.日志文件为空。我没有任何错误去理解为什么会发生。你能帮我理解为什么会发生这种情况,或者我必须做些什么才能看到错误。谢谢。 PS。这怎么看起来像Apache配置项目的媒体:
Alias /media/ /var/www/project/media/
<Directory /var/www/project/>
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Require all granted
</Directory>
您可能需要通过request.FILES
在form = ExtraProfileDataForm(request.POST, request.FILES)
def UserFullDataForm(request):
if request.method == 'POST':
form = ExtraProfileDataForm(data=request.POST, files=request.FILES)
if form.is_valid():
user_form = form.save(commit=False)
user_form.user = request.user
user_form.save()
return HttpResponseRedirect('/profile/')
else:
return render(request, 'profiles/extra_profile.html', {'form':form})
else:
form = ExtraProfileDataForm()
context = {'form':form}
return render (request, 'profiles/extra_profile.html', context)
你不要求一些代码。只需删除该代码,form.save()
将保存您的表单。像这样改变你的观点。
def UserFullDataForm(request):
if request.method == 'POST':
form = ExtraProfileDataForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect('/profile/')
else:
return render(request, 'profiles/extra_profile.html', {'form':form})
else:
form = ExtraProfileDataForm()
context = {'form':form}
return render (request, 'profiles/extra_profile.html', context)
由于您的表单将数据存储在两个不同的表中,因此您必须为您的表单编写自己的保存功能。
def save(self, commit=True, **kwargs):
user = super(UserCreateForm, self).save(commit=False)
# get or create record for UserProfile against user and save it
在你settings.py
,添加以下
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
在项目urls.py
,在年底
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
您模式将被改变这样
avatar = models.ImageField(upload_to='profile/avatar', blank=True, null=True)
添加以下行
谢谢你的回答我做了你的建议,之后我又有一个错误'列“user_id”中的空值违反了非空约束细节:失败的行包含(31,null,,null,rtyrtyr,,)。 –
非常感谢你我所做的一切,但它不保存图像 –
您是否在settings.py中设置了MEDIA_ROOT和MEDIA_URL。如果是,则在项目urls.py中添加'urlpatterns + = static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)'。请检查此文档(https://docs.djangoproject.com/en/1.9/ref/settings/#media-root)MEDIA_ROOT –
对我来说,这个问题与我的Python代码无关,它正确地没有返回任何错误。
问题是我的<form>
html没有enctype设置为支持文件发布。
例子:
<form action="." method="post" accept-charset="utf-8" enctype="multipart/form-data">
{{ form }}
</form>
谢谢您的回答。我添加'request.FILES'但仍然没有任何反应。 –
@Zagorodniy Olexiy在'form.is_valid()'后保存表单对象并尝试 – Kjjassy
我添加'form.save'后,我有另一个错误'列中的空值'user_id'违反了非空约束细节:失败的行包含(31 ,null,,null,rtyrtyr,,)。' –