Ручной доступ к содержимому из полей формы в Django
Я нахожусь в ситуации, когда я хотел бы отправить содержимое в форму, которая не определена в классе Forms.
Например, в моем forms.py:
class AnalyseForm(forms.Form):
TYPES = (('a', 'Type A'),('b', 'Type B'), ('c', 'Type C'))
filename = forms.FileField(label="Document to Aalyse")
doctype = forms.ChoiceField(choices=TYPES, label="Doc Type:")
и в моем views.py:
Я пытаюсь отправить дополнительную переменную, которой нет в классе Form, потому что я определил ее в HTML-файле вручную. Ответ на этот вопрос заключается не в том, чтобы определить ее в классе Form. У меня есть, например, другие HTML-виджеты, с которыми можно поиграть, включив их в определение формы Django.
def AnalyseDoc(request):
doctype=""
if request.method == "POST":
form = AnalyseForm(request.POST, request.FILES)
if form.is_valid():
filecontent = request.FILES['filename']
doctype=form.cleaned_data['doctype']
# dummydata=form.cleaned_data['dummydata']
print(dummydata)
analyse = analyseStuff(file=filecontent,doctype=doctype, dummydata=dummydata)
else:
form = AnalyseForm()
return render(
request,
"summary.html",
{
"dummydata": "x",
"form": form,
'filecontent': filecontent,
"doctype": doctype,
},
)
Это несколько затруднительно
<h1>What file would you like to Analyse?</h1>
<form action = "" method = "post" enctype="multipart/form-data">
<div class="form-check form-switch">
<label class="form-check-label" for="dummydata">Use Dummy Data</label>
<input class="form-check-input" type="checkbox" role="switch" id="dummydata" checked>
</div>
{% csrf_token %}
{{form | crispy}}
<button id="submit" type="submit" class="btn btn-primary">Analyse<button>
</form>
Это затруднительное положение. Как тогда мне получить доступ к значению 'dummydata' в данном случае
Очевидно, что я не могу получить содержимое из cleaned_data. Это не формальное поле формы. Я не могу увидеть его с помощью
request.POST.get('dummydata')
Есть какие-нибудь мысли о том, как я могу получить доступ к фиктивным данным в моей функции views?
Все, что вам нужно сделать в вашей ситуации, это указать атрибут name для вашего флажка. Вот также ссылка, которая может оказаться полезной. Что-то вроде этого:
<form action = "" method = "post" enctype="multipart/form-data">
<div class="form-check form-switch">
<label class="form-check-label" for="dummydata">Use Dummy Data</label>
<input class="form-check-input" type="checkbox" role="switch" id="dummydata" checked name="dummy">
</div>
{% csrf_token %}
{{form | crispy}}
<button id="submit" type="submit" class="btn btn-primary">Analyse</button>
</form>
А затем request.POST
:
<QueryDict: {'dummy': ['on'], 'csrfmiddlewaretoken': ['11wTd1DBszhGWk4JGFUgM4sH2lOSxLD44lu1g5XqtvY9K9z0ptdceeRMdx2ZFgjK'], 'doctype': ['a']}>