自动增加django后端的发票号以获取新发票

时间:2015-01-28 17:43:11

标签: python django django-admin django-admin-filters django-admin-tools

我想自动增加发票号码,即3位字符和4位数字。

class Invoice:
    invoice_no = models.CharField(max_length=500, null=True, blank=True, validators=[RegexValidator(regex='^[a-zA-Z0-9]*$',message='Invoice must be Alphanumeric',code='invalid_invoice number'),])

我在后端注册了这个模型。但是现在当我点击在admin中创建发票时,发票应该自动填写。当我再次点击在admin中创建新发票时,invoice_number应该加1并且应该是auto field。

发票编号为MAG0001,MAG0002,MAG0003等的Ex,当我点击创建新发票时,这应该是管理员中的自动字段。

4 个答案:

答案 0 :(得分:7)

定义生成发票编号的功能。

def increment_invoice_number():
    last_invoice = Invoice.objects.all().order_by('id').last()
    if not last_invoice:
         return 'MAG0001'
    invoice_no = last_invoice.invoice_no
    invoice_int = int(invoice_no.split('MAG')[-1])
    new_invoice_int = invoice_int + 1
    new_invoice_no = 'MAG' + str(new_invoice_int)
    return new_invoice_no

现在将此函数用作模型字段中的默认值。

invoice_no = models.CharField(max_length=500, default=increment_invoice_number, null=True, blank=True)

这只是一个想法。修改功能以匹配您的首选发票号格式。

答案 1 :(得分:2)

def invoiceIncrement():
    get_last_invoice_number
    incremente_last_invoice_number
    return next_invoice_number

class Invoice:
    invoice_no = models.CharField(max_length=500, null=True, blank=True, 
        validators=[RegexValidator(regex='^[a-zA-Z0-9]*$',
        message='Invoice must be Alphanumeric',code='invalid_invoice number'),], 
        default=invoiceIncrement)

试试这个:有一些明显的问题:

  1. 如果多人同时添加发票,可能会发生碰撞

  2. 每次创建新发票时,
  3. 都需要额外进行数据库调用。

  4. 另外:您可能只想考虑使用auto_increment或UUID。

答案 2 :(得分:1)

也许这段代码可以提供帮助

<input name="txttelephone" type="text" maxlength="16" id="txttelephone" class="InputTextBox" onkeypress="return NumbersOnly(event);" required />

答案 3 :(得分:0)

在上面的arulmr回答中,只需编辑字段

def increment_invoice_number():
    last_invoice = Invoice.objects.all().order_by('id').last()
    if not last_invoice:
        return 'MAG0001'
    invoice_no = last_invoice.invoice_no
    invoice_int = int(invoice_no.split('MAG')[-1])
    width = 4
    new_invoice_int = invoice_int + 1
    formatted = (width - len(str(new_invoice_int))) * "0" + str(new_invoice_int)
    new_invoice_no = 'MAG' + str(formatted)
    return new_invoice_no  

class Invoice(models.Model):
    invoice_no = models.CharField(max_length = 500, default = increment_invoice_number, null = True, blank = True)

这样可以正常工作。