Как проверить правильность ввода штрихкода с помощью django?

Я сделал приложение для генерации штрих-кодов, используя библиотеку python-barcode (Python) (django framework)

и есть два поля

1 - позволить пользователю ввести номер, который будет использоваться для генерации штрих-кода

2 - опции, позволяющие пользователю выбрать, какой тип штрихкода он хочет

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

но некоторые штрихкоды имеют свои специфические типы входов, например, 12 цифр или 8 цифр и так далее

так как же проверить вводимые данные, действительны ли они для данного типа штрихкода или нет?, затем показать сообщения об ошибке, если они неправильные, или сообщение об успехе, если они сгенерированы нормально

Я знаю, что могу использовать сообщения из самого django, но как я могу реализовать это с помощью функции проверки?

для views.py

from sre_constants import SUCCESS
from django.http import HttpResponse
from django.shortcuts import redirect, render
import barcode
from barcode.writer import ImageWriter
import tempfile
from django.contrib import messages


def index(request):
   context = {'barcode_types':barcode.PROVIDED_BARCODES}
   return render(request, 'index.html',context)

def generate_barcode(request):
   inputs = request.POST['inputs']
   types = request.POST['types']
   barcode_class = barcode.get_barcode_class(types)
   file = tempfile.NamedTemporaryFile()
   code = barcode_class(inputs,writer=ImageWriter())
   file_path = code.save(file.name)
   response = HttpResponse(open(file_path,'rb').read(), headers={'Content-Type': 'image/png','Content-Disposition': 'attachment; filename="'+inputs+'.png"'})
return response

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

  • Вы можете установить опции на входы формы, такие как max_length, min_length
  • .
  • Вы можете ограничить пользователей определенными типами данных:
    • целое число: IntegerField
    • короткий текст: CharField
    • числа с плавающей точкой: FloatField
  • Вы можете сделать поле обязательным для заполнения: required=True
  • Вы можете предоставить им ограниченный выбор: ChoiceField
  • Вы можете использовать дополнительные валидаторы

Если я правильно понял ваш вопрос, вам нужно проверить inputs на основе types, поэтому согласно документации , вам нужно переписать функцию clean для выполнения многополевой проверки

Метод clean() подкласса формы может выполнять валидацию, требующую доступа к нескольким полям формы. Здесь можно вставить такие проверки, как "если введено поле A, то поле B должно содержать действительный адрес электронной почты". При желании этот метод может вернуть совершенно другой словарь, который будет использоваться в качестве очищенных данных.

вот пример:

# forms.py

from django import forms
from django.core.exceptions import ValidationError

BARCODE_TYPES =(
    # (value, display)
    ("Code39", "Code 39"),
    ("Code128", "Code 128"),
    ("PZN7", "PZN 7"),
    ("EuropeanArticleNumber13", "EAN-13"),
    ("EuropeanArticleNumber8", "EAN-8"),
    ("JapanArticleNumber", "JAN"),
    ("InternationalStandardBookNumber13", "ISBN-13"),
    ("InternationalStandardBookNumber10", "ISBN-10"),
    ("InternationalStandardSerialNumber", "ISSN"),
    ("UniversalProductCodeA", "UPC-A"),
    ("EuropeanArticleNumber14", "EAN-14"),
    ("Gs1_128", "Gs1-128"),
)
class BarcodeForm(forms.Form):
    # You can use max_lenth, min_length, ....
    inputs = forms.CharField(label='Bacode data', max_length=100, required=True)
    types = forms.ChoiceField(label='The Bracode type', choices=BARCODE_TYPES, required=True)

    def clean(self):
        cleaned_data = super().clean()
        inputs = cleaned_data.get("inputs")
        types = cleaned_data.get("types")

        if types == "Code39":
            # validate input for Code39
            # Raise error with the message you want on invalid input:
            raise ValidationError("Invalid input for Code 39 barcode type, you should ......")
        elif types == "Code128":
            # validate input for Code128
            # Raise error with the message you want on invalid input:
            raise ValidationError("Invalid input for Code 128 barcode type, you should ......")
        # .....

Затем используйте эту форму в ваших представлениях следующим образом: (docs)

# views.py
from .forms import BarcodeForm

def generate_barcode(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = BarcodeForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
             # process the data in form.cleaned_data as required
     # .....
Вернуться на верх