2016-02-11 50 views
0

我有一個註冊表單,用戶可以上傳他們的個人資料的頭像,但我無法使其工作。我已經正確設置媒體:ImageField無法在窗體上傳,在管理面板中上傳

MEDIA_URL = '/media/' 
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 

我在我的剖面模型的一個ImageField的這樣:

class UserProfile(models.Model): 

    def is_square_png(self): 
     if not self.name.endswith('.png'): 
      raise ValidationError("You may only upload .png files!") 
     else: 
      w, h = get_image_dimensions(self) 
      if not h == w: 
       raise ValidationError("This picture is not square! Your picture must be equally wide as its height.") 
      else: 
       if not (h + w) >= 1000: 
        raise ValidationError("This picture is too small! The minimum dimensions are 500 by 500 pixels.") 
       else: 
        if not (h + w) < 2000: 
         raise ValidationError("This picture is too big! The maximum dimensions are 1000 by 1000 pixels.") 
     return self 

    def generate_user_folder_avatar(instance, filename): 
     return "users/%s/%s.png" % (instance.user, 'avatar') 

    ... 
    avatar = models.ImageField(upload_to=generate_user_folder_avatar,storage=OverwriteStorage(),validators=[is_square_png],blank=True) 

    ... 

而在我的ModelForm,我還包括它:

class UserProfileForm(ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
     for field_name, field in self.fields.items(): 
      field.widget.attrs['class'] = 'field-input-element' 

    class Meta: 
     model = UserProfile 
     fields = ('display_name', 'avatar', 'birthday', 'usertype', 'daw', 'usergenre', 'gender') 
     widgets = { 
      'birthday': AdminDateWidget(), 
     } 

以及在我看來:

def RegisterView(request): 

    registration_success = False 

    if request.method == 'POST': 
     user_form = UserForm(request.POST, prefix='uf') 
     profile_form = UserProfileForm(request.POST, request.FILES, prefix='upf') 

     if user_form.is_valid() and profile_form.is_valid(): 
      user_atr = user_form.save() 
      user_atr.set_password(user_atr.password) 
      user_atr.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user_atr 

      profile.avatar = request.FILES.get('avatar') 

      profile.save() 
      registration_success = True 

      user_atr = authenticate(username=user_form.cleaned_data['username'], 
         password=user_form.cleaned_data['password'], 
         ) 
      login(request, user_atr) 
      return HttpResponseRedirect("/") 

     else: 
      print (user_form.errors, profile_form.errors) 

    else: 
     user_form = UserForm(prefix='uf') 
     profile_form = UserProfileForm(prefix='upf') 

    return render(request, 'profile/register.html', {'profile_form': profile_form, 'user_form': user_form}) 

沒有ma當我提交表單時,就好像該字段被忽略了一樣。 django不會將網址添加到該字段,也不會實際上傳文件。

我得到了沒有錯誤,沒有!它只是簡單地不上傳,不會將URL添加到模型實例。

+0

是否打印'request.FILES的內容'?你在HTML表單中設置了enctype =「multipart/form-data」嗎? – LostMyGlasses

+0

打印request.FILES'的內容?不確定你的意思。但對於後者,是的。 –

+0

我的意思是檢查'request.FILES'是否包含上傳的圖像或者是否爲空。 – LostMyGlasses

回答

2

圖像將已經被ModelForm被保存,所以你只需要刪除行:

profile.avatar = request.FILES.get('avatar') 

和圖像將被保存在profile.save()