首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用django检查条形码的输入是否有效?

如何使用django检查条形码的输入是否有效?
EN

Stack Overflow用户
提问于 2022-06-24 17:04:55
回答 1查看 152关注 0票数 1

我制作了一个应用程序来生成条形码,使用Python-条形码库(Python)(django框架)

有两个领域

让用户输入将用于生成条形码的数字。

让用户选择他想要的条形码类型的选项

现在一切正常,它正在生成条形码

但有些条形码有其特定的输入类型,如12位或8位等。

因此,如何检查输入对于该类型的条形码是否有效?,如果错误,则显示错误消息;如果生成精细的,则显示错误消息。

我知道我可以使用django本身的消息,但是如何使用检查函数来实现它呢?

对于views.py

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-24 19:54:08

您应该使用表单来验证用户输入。

  • 您可以对表单输入设置选项,如max_lengthmin_length
  • 您可以将用户限制为特定的数据类型:
    • 整数:IntegerField
    • 短文:CharField
    • 浮点数:FloatField

  • 您可以创建一个必需的字段:required=True
  • 您可以给他们一些有限的选择:ChoiceField
  • 您可以使用其他验证器。

如果我正确理解了您的问题,您需要基于inputs验证types,所以根据文件需要覆盖clean函数来执行多字段验证。

表单子类的clean()方法可以执行需要访问多个表单字段的验证。这是您可能会进行检查的地方,例如“如果字段A被提供,字段B必须包含一个有效的电子邮件地址”。如果愿意,此方法可以返回一个完全不同的字典,该字典将用作cleaned_data。

以下是一个例子:

代码语言:javascript
复制
# 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 ......")
        # .....

然后在视图中使用以下形式:(文档)

代码语言:javascript
复制
# 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
     # .....
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72747316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档