2017-06-29 173 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