2011-09-06 8 views
0

먼저 코드를 입력하십시오. ModelForm (IM1 및 IM2가 models.ImageField입니다) :ImageFields가있는 ModelForm. 유효성 검사 오류 인 경우 올바르게 지워지지 않음

class TestForm(forms.ModelForm): 
    checkme = forms.BooleanField(required=True) 

    class Meta: 
     model = UserProfile 
     fields = ('im1', 'im2') 

이보기 :

def test(request): 
    profile = request.user.get_profile() 
    form = TestForm(instance=profile) 
    if request.method == "POST": 
     form = TestForm(request.POST, request.FILES, instance=profile) 
     if form.is_valid(): 
      form.save() 
    return render(request, 'test.html', {'form':form}) 

템플릿 :

<html> 
<head> 
<title>Test</title> 
</head> 
<body> 
<form method="post" enctype="multipart/form-data">{% csrf_token %} 
{{ form.as_p }} 
<input type="submit" value="submit" /> 
</form> 
</body> 
</html> 

문제점 :

이 IM1가 포함되어있는 경우 유효한 이미지를 입력하고 옆에있는 선택란을 선택하지만 checkme를 확인하지 않고 제출하면 fo rm은 checkme가 필요하다는 오류 메시지와 함께 다시 나타납니다. 오류와 함께 양식이 반환되지만 im1이 지워진 것처럼 나타납니다. 실제로 im1이 파일을 다시 표시하고 선택란을 지우는 형식으로 다시로드하기 때문에 실제로는 없습니다.

내 질문은 어떻게 해결할 수 있습니까? 내가하고있는 일이거나 장고와 관련이있는 것이지?

답변

0

장고는 정상적으로 작동합니다.

요청이 POST 요청 인 경우 양식은 request.POSTrequest.FILES의 데이터에 바인딩됩니다. instance=profile은 단순히 모든 유효성 검사가 통과하면 저장할 특정 개체를 폼에 알려주는 것입니다. 설문지가 유효하지 않더라도 삭제 된 이미지가 포함 된 데이터에 계속 바인딩되며 이는 render()으로 전달됩니다. 요청 방법은 POST 경우

첫째, 첫 번째 바운드 양식을 작성하면 안 둘째

def test(request): 
    profile = request.user.get_profile() 
    if request.method == "POST": 
     form = TestForm(request.POST, request.FILES, instance=profile) 
     if form.is_valid(): 
      form.save() 
    else: 
     form = TestForm(instance=profile) 
    return render(request, 'test.html', {'form':form}) 

, 왜 당신은 당신의 사용자가 두 번 그들이 정말로 원하는 않은 경우 똑같은 행동을하고 싶지 않습니다 이미지를 지우고 다른 체크 박스를 놓치셨습니까?

정말 이런 식으로 행동하는 장고가 필요한 경우 두 가지 중 하나를 수행 할 것입니다. UserProfile의 인스턴스에서 바운드 폼을 만들고 유효하지 않은 폼과 새로 만든 폼을 템플릿에 전달하고 유효하지 않은 폼을 사용하여 나머지 폼을 표시하는 다른 폼을 사용합니다 :

def test(request): 
    profile = request.user.get_profile() 
    if request.method == "POST": 
     errors_form = TestForm(request.POST, request.FILES, instance=profile) 
     if errors_form.is_valid(): 
      errors_form.save() 
      form = errors_form 
     else: 
      form = TestForm(instance=profile) 
      return render(request, 'test.html', {'form':form, 'errors_form': errors_form}) 
    else: 
     form = TestForm(instance=profile) 
    return render(request, 'test.html', {'form':form}) 

또는 나는 같은 일을하지만 사방 renders()와 끝까지하지 않도록 새로 만든 폼에 유효하지 않은 양식에서 오류를 저장할 것 :

def test(request): 
    profile = request.user.get_profile() 
    if request.method == "POST": 
     errors_form = TestForm(request.POST, request.FILES, instance=profile) 
     if errors_form.is_valid(): 
      errors_form.save() 
      form = errors_form 
     else: 
      form = TestForm(instance=profile) 
      #this is left up to you to implement, but you'd do something like 
      #form.errors = errors_form.errors 
      #and also iterate through every form attribute.errors and assign it to 
      #errors_form attribute.errors etc... 
    else: 
     form = TestForm(instance=profile) 
    return render(request, 'test.html', {'form':form}) 

두 가지 모두 매우 세련된 솔루션은 아니며 긍정적 인 것도 아닙니다. 두 번째 것은 내가 완전히 익숙하지 않기 때문에 해킹없이 예상대로 작동 할 것입니다. Django Forms 구현.

이 작업을 수행하는 것이 그만한 가치가있는 것은 아닙니다. 앞서 말했듯이, 당신은 당신의 사용자를 위해 더 많은 작업을하고 있습니다 ...

+0

도움을 주셔서 감사합니다. 이 테스트는 단순한 테스트 케이스이므로 사용자가 동일한 작업을 두 번 반복하도록합니다. 실제 사례에서 이미지는 프로필 사진이며 사용자는 사진이 사이트에서 공개 될 것임을 인정하는 상자를 선택해야합니다. 동일한 결과를 산출하는 또 다른 시나리오는 체크 박스가없는 경우이지만 im1에 대해 명확하고 im2에 비 이미지를 제공하는 것입니다. im2 오류 및 im1이 삭제 된 것처럼 보이는 양식이 반환됩니다.그것이 내가 원하지 않는 것입니다. im1 또는 2는 보이지 않는 경우 삭제됩니다. – joshcartme

+0

나는 당신이 지금 무슨 말을하고 있는지 이해할 것 같습니다. 당신은 당신이 요청의 내용을 볼 수 있다는 것을 기억해야합니다 .POST와 요청. 파일은 사전을 말합니다. "지우기"가 선택되어 있는지 확인할 수 있습니다. 수동으로 이미지를 삭제할 수 있으므로 양식 오류가 발생하여 페이지를 새로 고치면 다시 표시되는 대신 영원히 사라집니다. –

관련 문제