2017-03-09 6 views
3

私が直面している問題があります。私は関連するデータを含む学生のExcelをアップロードする必要があります。私はまた、ユーザーの入力として、学生のバッチを持っている必要があります。以下の私のコードは次のとおりです。Djangoアップロードフォーム、エラーの原因となる追加フィールド

Views.py

def import_student(request): 
    this_tenant=request.user.tenant 
    if request.method == "POST": 
     form = UploadFileForm(request.POST, request.FILES) 

     def choice_func(row): 
      data=student_validate(row, this_tenant, batch_selected) 
      return data 

     if form.is_valid(): 
      data = form.cleaned_data 
      batch_data= data['batch'] 
      batch_selected=Batch.objects.for_tenant(this_tenant).get(id=batch_data) 

      with transaction.atomic(): 
       try: 
        request.FILES['file'].save_to_database(
         model=Student, 
         initializer=choice_func, 
         mapdict=['first_name', 'last_name',  'dob','gender','blood_group', 'contact', 'email_id', \ 
         'local_id','address_line_1','address_line_2','state','pincode','batch','key','tenant','user']) 
        return redirect('student:student_list') 
       except: 
        transaction.rollback() 
        return HttpResponse("Error") 
     else: 
      print (form.errors) 
      return HttpResponseBadRequest() 
    else: 
     form = UploadFileForm(tenant=this_tenant) 

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

Forms.pyただし、エラーは、(私はエラーを印刷しています)提出の上に示されている

class UploadFileForm(forms.Form): 
    file = forms.FileField() 
    batch = forms.ModelChoiceField(Batch.objects.all()) 
    def __init__(self,*args,**kwargs): 
     self.tenant=kwargs.pop('tenant',None) 
     super (UploadFileForm,self).__init__(*args,**kwargs) # populates the post 
     self.fields['batch'].queryset =  Batch.objects.for_tenant(self.tenant).all() 
     self.helper = FormHelper(self) 
     self.helper.add_input(Submit('submit', 'Submit', css_class="btn-xs")) 
     self.helper.form_class = 'form-horizontal' 
     self.helper.label_class = 'col-sm-2' 
     self.helper.field_class = 'col-sm-4' 

形式は:

<ul class="errorlist"><li>batch<ul class="errorlist"><li>Select a valid choice. That choice is not one of the available choices.</li></ul></li></ul> 

バッチフィールドを削除すると、フォームがうまく機能しています。誰もこれで私を助けることができますか?

<option value="">---------</option> 

他の値と名前(の代わり-------)と他のオプションが選択取得されていません。

ポストは、常に最初のオプションを、取得しています。ただし、クライアントは実際には他のオプションを選択しています。

今、私は、エラーが原因で次の行で起きていることを発見しました:これがなければ

self.fields['batch'].queryset = Batch.objects.for_tenant(self.tenant).all() 

、フォームは素晴らしい作品。しかし、このラインは必須です。クエリーセットは動的に更新する必要があります。これはどうすればできますか?

答えて

0

フォームを保存するときにテナント引数を渡す必要があります。そうしないと、クエリセットが空になり、選択肢が選択されなくなります。

このコードは動作している必要があります。

if request.method == "POST": 
    form = UploadFileForm(request.POST, request.FILES, tenant=this_tenant) 
+0

うわー、日によって保存されていること。ありがとう! – Sayantan

関連する問題