В форме модели django принимается только двузначный целочисленный массив

Как сделать поле формы, которое принимает двузначный числовой массив во фронтенде. если кто-то вводит более 2 цифр или строку, то значение ввода автоматически проверяется, чтобы убедиться, что это правильно отформатированный двузначный целочисленный массив.

справа

enter image description here

неправильный ниже

enter image description here

Моя работа

models.py

class Jodi(models.Model):
  numb = ArrayField(models.IntegerField(null=True, blank=True), null=True, blank=True)

forms.py

from django import forms
from .models import Jodi
class MyModelForm(forms.ModelForm):
    class Meta:
        model = Jodi
        fields = ['numb',]

views.py

if request.method=='POST':
        fm = MyModelForm(request.POST)
        if fm.is_valid():
            numbers = fm.cleaned_data['numb']
            numbers1 = []
            for x in numbers:
                if x:
                    numbers1.append(x)
            X=Jodi.objects.create(numb=numbers1,)
            X.save()
else:
    fm = MyModelForm()
    return render(request,'myapp/home.html',{'form':fm})

home.html

<form action="" method="post">{% csrf_token %}
        
      {{ form.as_p }}
        
if fm.is_valid():
    numbers = fm.cleaned_data['numb']
    for n in numbers.split(','):
        if not n.isdigit() or len(n)!=2:
            # return render new form with error of not a valid input, input should be 2 digits numbers seprated by comma
    X=Jodi.objects.create(numb=numbers1,)
    X.save()

Используйте widget и attrs для установки pattern в поле формы.

Используйте шаблон ([0-9]{2})(,\s*[0-9]{2})* для пробелов после запятой ИЛИ используйте ([0-9]{2})(,[0-9]{2})* для отсутствия пробелов после запятой.

Использование виджета:

class MyModelForm(forms.ModelForm):
    # code
    numb = forms.CharField(required=True,widget=forms.TextInput(attrs={'pattern':'([0-9]{2})(,[0-9]{2})*',}))
    # code

Sample pattern in action:

<html !doctype>    
    <body>
        <form action="" method="get">  
            <label for="number_array">Number Array: </label>  
            <input type="text" 
               placeholder="00,11,22"  
               pattern="([0-9]{2})(,\s*[0-9]{2})*"  
               autofocus  
               required>  
            <button>Go </button>  
        </form> 
    </body>
</html>

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