Django преобразование строки в целое число
Я пытаюсь передать значение из моего шаблона в представление с помощью следующего кода:
<form action="{% url 'view_passwordgenerator' %}">
<select name="length">
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12" selected="selected">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
</select> Length
<input type="submit" value="Generate Password" class="btn btn-primary">
</form>```
просмотров
def view_passwordgenerator(request):
length = int(request.GET.get('length'))
for i in range(length):
...
return render(request, 'home/passwordgenerator.html')
Появляется эта ошибка:
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
я просто ищу способ вывести int из шаблона без этой ошибки, может есть другой способ привести его.
Вероятно, вы отображаете и страницу с формой, и страницу с результатом при отправке формы одним и тем же представлением.
В результате, когда вы впервые отображаете это представление, length
будет отсутствовать, поэтому вы должны проверить и привести его к int
, только если мы знаем, что он является частью словаря:
def view_passwordgenerator(request):
if 'length' in request.GET:
length = int(request.GET.get('length'))
for i in range(length):
# …
return render(request, 'home/passwordgenerator.html')
return …
Это все же не очень элегантно, поскольку люди могут использовать URL для вставки данных в request.GET
, а это само по себе не является int. Наиболее элегантным способом, вероятно, будет использование формы Django:
from django import forms
class MyForm(forms.Form):
length = forms.IntegerField()
тогда вы можете проверить валидность формы:
def view_passwordgenerator(request):
form = MyForm(request.GET)
if form.is_valid():
for i in range(form.cleaned_data['length']):
# …
return render(request, 'home/passwordgenerator.html')
return …