Ограничение символов, которые пользователь может ввести в поле ввода в django OR html?

У меня были разные случаи, когда я хотел, но не мог ограничить символы, вводимые пользователем при html-вводе. Например, что мне делать, если мне нужны только цифры и буквы? Никаких других, например £-"<#>{[. И что мне делать, если я хочу, чтобы они вводили только заглавные буквы? Спасибо за помощь:)

Есть несколько способов сделать это, через валидацию формы Django, атрибуты HTML или Javascript.

Django Validation + HTML атрибуты

class TheForm(forms.ModelForm):
    class Meta:
        model = ModuleChoice
        fields = (
            'text',
            )

    def __init__(self,  *args, **kwargs):
        super(TheForm, self).__init__(*args, **kwargs)

        # HTML attributes:
            # Max Length, user physically couldn't type more than 35
            # some fields also can have the `pattern` attribute which allows you to have REGEX
        self.fields['text'].widget.attrs={'class': 'form-control', 'maxlength': '35'}


    def is_valid(self):
        valid = super(TheForm, self).is_valid()
        if not self.cleaned_data.get('text'):
            self.add_error('text', 'text needs a Value')
            valid = False

        invalidChars = [ '£', '-', '“', '<', '#', '>', '{', '[' ]
        if any([c in self.cleaned_data.get('text') for c in invalidChars]):
            # error ( {field}, {msg} )
            self.add_error('text', 'These £-“<#>{[ characters are Illegal.')
            valid = False

        if self.cleaned_data.get('text').islower():
            self.add_error('text', 'All Letters Must be all Upper Case.')
            valid = False

        # you could also do Regex:
        import re
        if re.findall('^Nealium.*Uncool$', self.cleaned_data.get('text')):
            self.add_error('text', 'You cannot say Nealium is Uncool.')
            valid = False

        # the sky is the limit..
        if The.objects.filter(text=self.cleaned_data.get('text')).count():
            self.add_error('text', 'Duplicate Text.')
            valid = False

        return valid

Затем вы поместите, below, в ваш шаблон, и если вы повторно отобразите страницу с недействительной формой, она покажет их.

{% if form.errors %}{{form.errors}}{% endif %}

Или вы можете использовать, ниже, таким образом, доступ к вашим ошибкам в шаблоне

print(form.errors)
print(form.errors.as_data())

Делать это через Javascript очень похоже на is_valid() в Django Forms, вы просто переопределите стандартное событие form.save и добавите несколько операторов if выше отправки


Редактировать

Да, вы можете сделать это в View- Конкретно в POST:

def theview(request):
    if request.method == 'POST'
        valid = True
        text = request.POST.get('text')

        invalidChars = [ '£', '-', '“', '<', '#', '>', '{', '[' ]
        if any([c in text for c in invalidChars]):
            msg = 'These £-“<#>{[ characters are Illegal.'
            valid = False

        # other validation

        if valid:
            The.object.create(text=text)
            render(request, 'success.html')
        # not valid

Или вы можете сделать это в Шаблоне, если вы вручную выводите поля формы

<form method="post">
    <input id="id_text" name="text" maxlength="35"/>
    <submit>Submit</submit>
</form>

<
<form method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>
<
<form method="post">
    {% csrf_token %}
    {{ form.text }}
    <input type="submit" value="Submit">
</form>
<
def theview(request):
    form = TheForm()

    if request.method == 'POST'
        form = TheForm(request.POST)
        if form.is_valid():
            form.save()

            render(request, 'success.html')
      
    data = {
        'form': form,
    }
    return render(request, 'form.html', data)

и ваш View выглядит как:

Вернуться на верх