2013-05-29 5 views
0

장고를 가지고 있습니다. 내 서버에 제출하려고합니다. 제출 버튼을 누르면 전송 요청이 전송되고 두 개의 객체 (stream_id 및 image)가보기 기능으로 전송됩니다. 디버그 페이지에서 객체에 각각 POST 및 FILES 객체의 stream_id와 image가 모두 포함되어 있음을 알 수 있습니다.장고 오류가 이미지 필드를 양식으로 제출 중입니다.

그러나 뷰 기능이 명중하면, 나는 시도하고 다음과 같이 양식을 초기화 :

uploadImageForm = UploadImageForm(request.POST, request.FILES) 

을 그리고 나를 던져 유효성 검사 오류를 얻을.

[28/May/2013 18:46:32] DEBUG [ct:194] uploadImage - method is post, errors: 
<ul class="errorlist"><li>stream_id<ul class="errorlist"> 
<li>This field is required.</li></ul></li> 
<li>image<ul class="errorlist"><li>This field is required.</li></ul></li></ul> 
[28/May/2013 18:46:32] DEBUG [ct:195] cleaned data: {} 

왜 그런가?

내 양식 :

class UploadImageForm(forms.Form): 
    image = forms.ImageField() 
    image.widget.attrs["onchange"]="this.form.submit();" 
    stream_id = forms.CharField(max_length=100) 
    stream_id.widget.attrs["style"]="display:none;" 

    def __init__(self,stream_id,*args,**kwrds): 
     super(UploadImageForm,self).__init__(*args,**kwrds) 
     self.fields['stream_id'].widget.attrs["value"]= stream_id 

모델 : views.py에서

class Stream(models.Model): 
    tracked_user = models.ForeignKey(TrackedUser) 
    stream_id = models.CharField(max_length=255) 
    stream_hash = models.CharField(max_length=255) 
    name = models.CharField(max_length=60) 
    start_time = models.DateTimeField(default=datetime.datetime.now(pytz.utc)) 
    end_time = models.DateTimeField(default=None) 
    end_time.null = True 
    image = models.ImageField(upload_to="/") 
    image.null = True 

    def __unicode__(self): 
     return self.name 

코드 : 흥미롭게도

def uploadImage(request): 
    uploadImageForm = None 
    if (request.method == "POST"): 
     uploadImageForm = UploadImageForm(request.POST, request.FILES) 
     log.debug("uploadImage - method is post, errors: " + 
      str(uploadImageForm.errors)) 

, 바인딩 된 폼 출력은 다음과 같이

<p> 
    <label for="id_image">Image:</label> 
    <input id="id_image" name="image" onchange="this.form.submit();" type="file" /> 
</p> 
<ul class="errorlist"> 
    <li>This field is required.</li> 
</ul> 

<p> 
    <label for="id_stream_id">Stream id:</label> 
    <input id="id_stream_id" maxlength="100" name="stream_id" 
     style="display:none;" type="text" value="&lt;QueryDict: 
     {u&#39;stream_id&#39;:[u&#39;d21256f37601d2800b0b9604f0e94e1e&#39;], 
     u&#39;csrfmiddlewaretoken&#39;: 
     [u&#39;F0fmAD0VAj0RHrM0GGfnaSb6vTNgj9ZJ&#39;]}&gt;" /> 
</p> 
+0

당신은 당신의 모델을 게시하고 형성시겠습니까 ... 당신이 ModelForm에서 상속하는 의미 생각 해요? – Brandon

+0

@Brandon 제발 봐! – khalid13

답변

0

Django 양식의 모든 입력란은 기본적으로 필요하므로 스트림 ID 및 기타 입력란에 오류가 발생합니다. 당신이 필요하고 싶지 않은, 또는 선택적으로 폼 클래스에 필요한 만든다 필드에 blank=True 설정 : 나는 당신이 ImageUploadForm으로 무슨 일을하는지 아주 잘 모르겠습니다

class Stream(models.Model): 
    tracked_user = models.ForeignKey(TrackedUser) 
    stream_id = models.CharField(max_length=255, blank=True) 
    stream_hash = models.CharField(max_length=255, blank=True) 
    name = models.CharField(max_length=60) 
    start_time = models.DateTimeField(default=datetime.datetime.now(pytz.utc)) 
    end_time = models.DateTimeField(default=None, null=True) 
    image = models.ImageField(upload_to="/") 

    def __unicode__(self): 
     return self.name 

,하지만 당신은 갈거야 현재 작성된 방식으로 초기화 오류를 가져옵니다. 귀하는 귀하의보기에서 stream_id을 전달하지 않습니다.

class UploadImageForm(forms.Form): 
    image = forms.ImageField() 
    image.widget.attrs["onchange"]="this.form.submit();" 
    stream_id = forms.CharField(max_length=100) 
    stream_id.widget.attrs["style"]="display:none;" 

    def __init__(self, *args, **kwargs): 
     stream_id = kwargs.pop('stream_id') 
     super(UploadImageForm,self).__init__(*args, **kwargs) 
     self.fields['stream_id'].widget.attrs["value"]= stream_id 

나는

class UploadImageForm(forms.ModelForm): 
    class Meta: 
     model = Stream 

    def __init__(self, *args, **kwargs): 
     stream_id = kwargs.pop('stream_id') 

     super(UploadImageForm, self).__init__(*args, **kwargs) 

      # this is really bad practice. I would add this click handler 
      # unobtrusively 
      self.fields['image'].widget.attrs["onchange"] = "this.form.submit();" 
      stream_id = self.fields['stream_id'] 

      # not sure what you're trying to accomplish here... 
      self.fields['stream_id'].widget.attrs["style"] = "display:none;" 

      stream_id.initial = stream_id 
관련 문제