Python Django-modelform不';无法保存图像

Python Django-modelform不';无法保存图像,python,django,apache,django-forms,Python,Django,Apache,Django Forms,我使用Ubuntu 14.10和apache2 web服务器。在我的Django项目中,我有一个模型,其中包含关于用户的其他信息: class UserProfile(models.Model): class Meta: verbose_name_plural = u'User profile' user = models.OneToOneField(User) birthday = models.DateField(blank=True, null=True)

我使用Ubuntu 14.10和apache2 web服务器。在我的Django项目中,我有一个模型,其中包含关于用户的其他信息:

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
文件夹的Chown是
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>
Alias/media//var/www/project/media/
选项索引多视图跟随符号链接
不允许超限
要求所有授权

您可能需要在
form=ExtraProfileDataForm(request.POST,request.FILES)中传递
request.FILES


您有一些不需要的代码。只需删除该代码,因为
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
由于表单将数据存储在两个不同的表中,因此必须像这样为表单编写自己的保存函数

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
设置.py
中,添加以下内容

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
在您的项目
url.py
中,在末尾添加以下行

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
你的模型会像这样改变

avatar = models.ImageField(upload_to='profile/avatar', blank=True, null=True)

对我来说,这个问题与我的Python代码无关,因为Python代码正确地没有返回任何错误

问题是我的
html没有enctype设置为支持文件发布

例如:

<form action="." method="post" accept-charset="utf-8" enctype="multipart/form-data">
    {{ form }}
</form>

{{form}}

谢谢您的回答。我添加了
request.FILES
,但仍然没有发生任何事情。@zagordniy Olexiy在
form.is\u valid()之后保存表单对象,并在我添加
form.save
之后,我在列“user\u id”中发现另一个错误
null值违反了非null约束详细信息:失败的行包含(31,null,null,rtyrtyr,).
非常感谢我按照您的建议做了所有事情,但没有保存图像谢谢您的回答我按照您的建议做了,之后我在“user\u id”列中出现另一个错误
null值违反了非null约束详细信息:失败行包含(31,null,null,rtyrtyr,).
非常感谢。我已按您的建议做了所有操作,但没有保存图像。请在settings.py中设置MEDIA\u ROOT和MEDIA\u URL。如果是,则在项目中添加
urlpatterns+=static(settings.MEDIA\u URL,document\u root=settings.MEDIA\u root)
。检查此()文档中的媒体根这是我的媒体根和媒体URL文件
MEDIA\u ROOT=os.path.join(BASE\u DIR,'MEDIA')MEDIA\u URL='/MEDIA/'
,我通过apache服务器提供媒体和静态文件!你似乎是唯一知道这一点的回答者。投票表决。