2015-10-27 10 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)) 

Вот что я пытался сохранить изображение в БД, даже если другие поля не являются заполнен, но я получаю ошибку Джанго ошибки при загрузке - Загрузить действительное изображение (либо не изображение или поврежден):

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

Это, как я сделал его работу. Обратите внимание, что в качестве параметра конструктора формы в «else» нет значения «request.FILES», если форма недействительна. Именно это заставило 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^