2017-01-06 2 views
0
# models.py 
class Profile(models.Model): 
    name = models.CharField(max_length=255) 
    image = models.ImageField(upload_to=image_path, blank=True, null=True) 

# forms.py 
class ProfileForm(ModelForm): 
    class Meta: 
     model = Profile 
     fields = '__all__' 

# views.py 
def profile(request, id): 
    p = get_object_or_404(Profile, pk=id) 
    profile_form = ProfileForm(request.POST or None, 
           files=request.FILES or None, 
           instance=p) 

    if request.method == 'POST': 
     if profile_form.is_valid(): 
      profile_form.save() 

    return render(request, 'profile.html', {'form': profile_form}) 

#profile.html 
<form method="post" action="" enctype="multipart/form-data" > 
    {% csrf_token %} 
    {{ form }} 
    <input type="submit" value="Submit" /> 
</form> 

Если пользователь GETs/профиль/1 и 1 существует, они получают форму укажи со всеми значениями, в том числе изображения (если таковые имеются)Джанго 1,10: При визуализации ModelForm после обновления, ImageFields не хватает, когда они изменили

Если пользователь затем POST обновляет любое из полей, кроме изображения (очистка или изменение), страница отображается правильно после обновления.

Однако, если пользователь меняет изображение (очистить или изменить), это изменение не будет отражено в рендерном результате: изображение всегда отображается как пустое. быстрый GET решает ситуацию и отображает измененную ситуацию.

Кто-нибудь знает, почему в этой области не отображается обновление?

ответ

0

Вам не нужно какое-то перенаправление куда-нибудь (очевидно, с GET), когда форма профиля успешно сохраняется? Вы всегда возвращались render...., и если у вас есть POST, просьба заполнить форму с данными POST. Так должно быть:

# views.py 
def profile(request, id): 
    p = get_object_or_404(Profile, pk=id) 
    profile_form = ProfileForm(request.POST or None, files=request.FILES or None, instance=q) 

    if request.method == 'POST': 
     if profile_form.is_valid(): 
      profile_form.save() 
      # do the GET request to some page 
      return redirect('some-view-name', foo='bar') 

    return render(request, 'profile.html', {'form': profile_form}) 
+0

с добавлением return redirect() работает, но зачем мне? Я должен иметь все данные в profile_form, почему он отличается от экземпляра без данных POST? Это также дополнительный HTTP-запрос и дополнительный вызов БД. – djoek

+0

Аргумент 'instance' для формы модели только предоставляет форме доступ к объекту, он не определяет данные, которые несет форма. Если у вас есть данные «POST» в форме, это будет отображаться форма. Таким образом, необходимо иметь «дополнительный запрос и вызов db», проверить django doc о том, как работать с формой: https://docs.djangoproject.com/en/1.10/topics/forms/#the-view –