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 …
Вернуться на верх