Ограничение символов, которые пользователь может ввести в поле ввода в 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 выглядит как: