Форма загрузки Django, дополнительное поле вызывает ошибку

Есть проблема, с которой я сталкиваюсь. Мне нужно загрузить Excel студентов, содержащих соответствующие данные. Мне также нужно иметь в качестве пользовательского ввода партию студента. Ниже приведены мои коды:

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()

Без этого форма прекрасно работает. Но эта линия обязательна. Набор запросов должен динамически обновляться. Как это может быть сделано?

1 ответ

Решение

Вы должны передать аргумент арендатора при сохранении формы, в противном случае его набор запросов будет пуст и ваш выбор не будет выбран.

Этот код должен работать:

if request.method == "POST":
    form = UploadFileForm(request.POST, request.FILES, tenant=this_tenant)
Другие вопросы по тегам