2016-02-29 74 views
1

我使用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> 

回答

0

您可能需要通過request.FILESform = 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) 
+0

謝謝您的回答。我添加'request.FILES'但仍然沒有任何反應。 –

+0

@Zagorodniy Olexiy在'form.is_valid()'後保存表單對象並嘗試 – Kjjassy

+0

我添加'form.save'後,我有另一個錯誤'列中的空值'user_id'違反了非空約束細節:失敗的行包含(31 ,null,,null,rtyrtyr,,)。' –

0

你不要求一些代碼。只需刪除該代碼,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) 
添加以下行
+0

謝謝你的回答我做了你的建議,之後我又有一個錯誤'列「user_id」中的空值違反了非空約束細節:失敗的行包含(31,null,,null,rtyrtyr,,)。 –

+0

非常感謝你我所做的一切,但它不保存圖像 –

+0

您是否在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 –

0

對我來說,這個問題與我的Python代碼無關,它正確地沒有返回任何錯誤。

問題是我的<form> html沒有enctype設置爲支持文件發佈。

例子:

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