2015-10-27 32 views
1

我有一個相當標準的模式和形式。我有一個ImageField必填字段。當用戶選擇一個圖像並且沒有輸入必填字段時,圖像不會保存,用戶需要重新上傳。Django的 - 如何保存的ImageField即使表單不正確

由於在數據庫中的行已存在(因爲這種形式是一個「嚮導」的一部分),我不介意保存在數據庫中的圖片,即使所有的表格是不是所有的強制性數據有效。

這就是我現在所擁有的在我看來,當您填寫所有的必填字段,其工作原理:

def my_view(request): 
    instance = MyModel.objects.get(user=request.user) 
    form = MyForm(instance=instance) 

    if request.POST: 
     form = MyForm(request.POST, request.FILES, instance=instance) 
     if form.is_valid(): 
      new_instance = form.save(commit=False) 

      if request.FILES and request.FILES['photo']: 
       uploaded_photo = request.FILES['photo'] 
       new_instance.photo = uploaded_photo 

      new_instance.save() 
      return HttpResponseRedirect(reverse('new_url')) 

    return render_to_response('current_template.html', locals(), context_instance=RequestContext(request)) 

這裏就是我試圖將圖片保存在DB即使其他領域不填補,但我得到的錯誤Django的上傳錯誤 - 上傳一個有效的圖像(或者沒有圖像或損壞)

def my_view(request): 
    instance = MyModel.objects.get(user=request.user) 
    form = MyForm(instance=instance) 

    if request.POST: 
     form = MyForm(request.POST, request.FILES, instance=instance) 

     if request.FILES and request.FILES['photo']: 
      uploaded_photo = request.FILES['photo'] 
      instance.photo = uploaded_photo 
      instance.save() 

     if form.is_valid(): 
      new_instance = form.save() 
      return HttpResponseRedirect(reverse('new_url')) 

    return render_to_response('current_template.html', locals(), context_instance=RequestContext(request)) 

這裏是我的形式(很簡單):

class MyForm(ModelForm): 
    first_name = forms.CharField(label='First Name', max_length=50, required=True) 
    last_name = forms.CharField(label='Last Name', max_length=50, required=True) 
    photo = forms.ImageField(required=False) 

    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 

    class Meta: 
     model = MyModel 
     fields = ('first_name','last_name', 'photo') 

這裏是我的模型(同樣很簡單):

class MyModel(models.Model): 
    first_name = models.TextField(max_length=50) 
    last_name = models.TextField(max_length=50) 
    photo = ImageField(upload_to=get_photo_path,null=True,blank=True) 

回答

0

這是我如何做它的工作。請注意,當表單無效時,沒有'request.FILES'作爲'else'表單構造函數的參數。這是使Django顯示錯誤消息的原因。

if form.is_valid(): 
    instance = form.save(commit=False) 

    if request.FILES and request.FILES['photo']: 
     instance = save_photo(instance, request.FILES['photo']) 

    instance.save() 
    return HttpResponseRedirect(reverse('url')) 
else: 
    if request.FILES and request.FILES['photo']: 
     instance = save_photo(instance, request.FILES['photo']) 
     form = InstanceForm(request.POST, instance=instance)