2017-06-29 170 views
1

我正在嘗試上傳圖片。這是用戶個人資料的頭像圖片。Django圖片上傳問題

目前,表單沒有返回錯誤,但我的數據庫或我的文件夾media/avatar /上沒有寫入任何內容。

怎麼了?

我的觀點:

def view_avatar(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES, instance=request.user.profile) 
     if form.is_valid(): 
      form.save()    
    else: 
     form = UploadFileForm(instance=request.user.profile) 
    return render(request, 'avatar.html', locals()) 

我的形式:

class UploadFileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('avatar',) 

我的模型:

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    birthdate = models.DateField(null=True, blank=True) 
    avatar = models.ImageField(upload_to='media/avatar/', blank=True, null=True) 
+0

您是否在代碼中驗證表單後添加了'form.save()'。它不在你提供的代碼片段中。 –

+0

沒有在這個代碼Ididn't。但是當我添加它時,我有一個錯誤:UploadFileForm'對象沒有'保存'屬性。我現在更新我的代碼。 – GrandGTO

+0

您應該使用'ModelForm'或編寫自定義保存方法。 'forms.Form'沒有任何保存方法。這就是你得到這個錯誤的原因。 –

回答

0

我忘了ENCTYPE! 解決方案是:

<form method="POST" action="" enctype="multipart/form-data"> 
+0

很高興,它排序=) –

1

,那是因爲它使用的是從forms.Form繼承的形式,你需要請使用forms.ModelForm直接保存實例。

改變這一行,

class UploadFileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('avatar',) 

    def save(self, *args, **kwargs): 
     profile, created = Profile.objects.get_or_create(user=self.user) 
     profile.avatar = self.cleaned_data['avatar'] 
     profile.save() 
     return profile 

此外,編輯您的看法是這樣,

if form.is_valid(): 
    file = form.save(commit=False) 
    file.user = request.user 
    file.save() 
+0

更好!我有一個錯誤:(1048,「列'user_id'不能爲空') – GrandGTO

+0

(1062,」關鍵'user_id'重複條目'4'「) – GrandGTO

+0

此用戶是否已有一個配置文件?該錯誤說,它已經有了,你已經在你的模型中定義了一個OneToOne字段,那麼你只能爲每個用戶添加一個配置文件.. – zaidfazil

0

您可以編寫自定義保存方法,這是這樣的。

查看:

def view_avatar(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES, user=request.user) 
     if form.is_valid(): 
      form.save() 

    else: 
     form = UploadFileForm() 
    return render(request, 'avatar.html', locals()) 

表:

class UploadFileForm(forms.Form): 
    class Meta: 
     model = Profile 
     fields = ('avatar',) 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user', None) 
     super(UploadFileForm, self).__init__(*args, **kwargs) 
     self.fields['avatar'].required = False 

    avatar = forms.FileField() 


    def save(self, *args, **kwargs): 
     user_profile, created = Profile.objects.get_or_create(user=self.user) 
     user_profile.avatar = self.cleaned_data.get('avatar') 
     user_profile.save() 
     return user_profile 
+0

我試過了,但沒有奏效。我更新我的帖子 – GrandGTO

1

爲了使您可以使用信號的輪廓。

這樣,無論何時添加了一個新的用戶,將爲該用戶生成的配置文件自動

models.py

from django.conf import settings 
from django.db.models.signals import post_save 


class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    birthdate = models.DateField(null=True, blank=True) 
    avatar = models.ImageField(upload_to='media/avatar/%y/%m/%d', blank=True, null=True) 


def post_save_profile(sender, instance, created, *args, **kwargs): 
    if created: 
     try: 
      Profile.objects.create(user=instance) 
     except: 
      pass 

post_save.connect(post_save_profile, sender=settings.AUTH_USER_MODEL) 

和更新如生日信息和頭像,你可以使用的ModelForm。

forms.py

class UploadFileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('birthdate', 'avatar') 

    def __init__(self, *args, **kwargs): 
     super(UploadFileForm, self).__init__(*args, **kwargs) 
     self.fields['avatar'].required = False 

views.py

def view_avatar(request): 
    user = request.user 
    if request.method == "POST": 
     form = UploadFileForm(request.POST, request.FILES, instance=user.profile) 
      if form.is_valid(): 
       form.save() 

的頭像模板,你可以使用這個:

<img src="{% if user.profile.avatar %}{{ user.profile.avatar.url }}{% else %}{% static 'no-avatar.jpg' %}{% endif %}"><i></i> 
+0

謝謝,從Django沒有錯誤,但沒有出現在數據庫(和不幸的生日字段已被重置爲NULL)。我的文件夾媒體/頭像/也沒有。 – GrandGTO

+0

我使用新代碼更新我的帖子 – GrandGTO

+0

我在一個項目及其工作中使用此代碼。也許你錯過了什麼?並且應該正確設置media_root,以便將文件上載到正確的文件夾中。如果你已經有了用戶,你需要全部刪除它們或刪除你的數據庫。此代碼僅在添加新用戶時起作用,並且在添加此代碼之前,如果您的用戶很少,則此功能無效。祝你好運;)@GrandGTO – Navid2zp