基于 Django 表单的视图 GET 响应
Django form based view GET response
为了在网站主页上创建一个表单,我创建了一个表单 class 和一个请求 class。
不知何故,我无法在 url 查询字符串中获得响应。
有人可以帮我解决这个问题吗?
views.py
def index(request):
if request.method == 'GET':
form = CurrencyConverterForm(request.GET)
if form.is_valid():
base_currency = form.data.__getitem__('base_currency')
counter_currency = form.data.__getitem__('counter_currency')
base_amount = form.data.__getitem__('base_amount')
counter_amount = get_conversion_amount(base_currency, counter_currency, datetime.now(), base_amount)
response = HttpResponseRedirect('/')
response['base_currency'] = base_currency
response['counter_currency'] = counter_currency
response['base_amount'] = base_amount
return response
else:
form = CurrencyConverterForm()
context = {'form': form}
return render(request, '../templates/client/index.html', context)
forms.py
class CurrencyConverterForm(forms.Form):
base_currency = forms.ModelChoiceField(queryset=Currency.objects.all(), required=True)
counter_currency = forms.ModelChoiceField(queryset=Currency.objects.all(), required=True)
base_amount = forms.FloatField(required=True)
urls.py
urlpatterns = [
url(r'^$', views.index),
url(r'^admin/', admin.site.urls),
]
index.html
<form action="" method="get">
{{ form.as_ul }}
<input type="submit" value="Convert"/>
</form>
您需要像这样访问表单数据:
data = form.cleaned_data['data']
因此您的视图必须如下所示:
def index(request):
if request.method == 'GET':
form = CurrencyConverterForm(request.GET)
if form.is_valid():
base_currency = form.cleaned_data['base_currency']
counter_currency = form.cleaned_data['counter_currency']
base_amount = form.cleaned_data['base_amount']
counter_amount = get_conversion_amount(base_currency, counter_currency, datetime.now(), base_amount)
response = HttpResponseRedirect('/')
response['base_currency'] = base_currency
response['counter_currency'] = counter_currency
response['base_amount'] = base_amount
return response
else:
form = CurrencyConverterForm()
context = {'form': form}
return render(request, '../templates/client/index.html', context)
我已经解决了。
实际上我需要的代码比我预期的要少得多。
def index(request):
counter_amount = ""
if request.method == 'GET':
form = CurrencyConverterForm(request.GET)
if form.is_valid():
form_base_currency = form.cleaned_data['form_base_currency']
form_counter_currency = form.cleaned_data['form_counter_currency']
form_base_amount = form.cleaned_data['form_base_amount']
# Calculate the counter_amount
counter_amount = get_conversion_amount(form_base_currency, form_counter_currency, datetime.now(),
form_base_amount)
# Retrieve the counter amount from the dict
counter_amount = counter_amount['GetConversionAmountResult']
# Maximize the number of decimals to 4
if counter_amount.as_tuple().exponent < -4:
counter_amount = "%.4f" % counter_amount
else:
form = CurrencyConverterForm()
context = {
'form': form,
'counter_amount': counter_amount
}
return render(request, '../templates/client/index.html', context)
为了在网站主页上创建一个表单,我创建了一个表单 class 和一个请求 class。 不知何故,我无法在 url 查询字符串中获得响应。
有人可以帮我解决这个问题吗?
views.py
def index(request):
if request.method == 'GET':
form = CurrencyConverterForm(request.GET)
if form.is_valid():
base_currency = form.data.__getitem__('base_currency')
counter_currency = form.data.__getitem__('counter_currency')
base_amount = form.data.__getitem__('base_amount')
counter_amount = get_conversion_amount(base_currency, counter_currency, datetime.now(), base_amount)
response = HttpResponseRedirect('/')
response['base_currency'] = base_currency
response['counter_currency'] = counter_currency
response['base_amount'] = base_amount
return response
else:
form = CurrencyConverterForm()
context = {'form': form}
return render(request, '../templates/client/index.html', context)
forms.py
class CurrencyConverterForm(forms.Form):
base_currency = forms.ModelChoiceField(queryset=Currency.objects.all(), required=True)
counter_currency = forms.ModelChoiceField(queryset=Currency.objects.all(), required=True)
base_amount = forms.FloatField(required=True)
urls.py
urlpatterns = [
url(r'^$', views.index),
url(r'^admin/', admin.site.urls),
]
index.html
<form action="" method="get">
{{ form.as_ul }}
<input type="submit" value="Convert"/>
</form>
您需要像这样访问表单数据:
data = form.cleaned_data['data']
因此您的视图必须如下所示:
def index(request):
if request.method == 'GET':
form = CurrencyConverterForm(request.GET)
if form.is_valid():
base_currency = form.cleaned_data['base_currency']
counter_currency = form.cleaned_data['counter_currency']
base_amount = form.cleaned_data['base_amount']
counter_amount = get_conversion_amount(base_currency, counter_currency, datetime.now(), base_amount)
response = HttpResponseRedirect('/')
response['base_currency'] = base_currency
response['counter_currency'] = counter_currency
response['base_amount'] = base_amount
return response
else:
form = CurrencyConverterForm()
context = {'form': form}
return render(request, '../templates/client/index.html', context)
我已经解决了。
实际上我需要的代码比我预期的要少得多。
def index(request):
counter_amount = ""
if request.method == 'GET':
form = CurrencyConverterForm(request.GET)
if form.is_valid():
form_base_currency = form.cleaned_data['form_base_currency']
form_counter_currency = form.cleaned_data['form_counter_currency']
form_base_amount = form.cleaned_data['form_base_amount']
# Calculate the counter_amount
counter_amount = get_conversion_amount(form_base_currency, form_counter_currency, datetime.now(),
form_base_amount)
# Retrieve the counter amount from the dict
counter_amount = counter_amount['GetConversionAmountResult']
# Maximize the number of decimals to 4
if counter_amount.as_tuple().exponent < -4:
counter_amount = "%.4f" % counter_amount
else:
form = CurrencyConverterForm()
context = {
'form': form,
'counter_amount': counter_amount
}
return render(request, '../templates/client/index.html', context)