Django型号唯一银行支票号码6位

Django型号唯一银行支票号码6位,django,django-models,django-forms,django-templates,django-views,Django,Django Models,Django Forms,Django Templates,Django Views,我试图通过django doc的帮助设置唯一的6位支票号码。但我仍然不希望期望的结果意味着它接受任何数字或字符,但我希望这将只接受6个整数,并确保该数字对所有用户都是唯一的 models.py from django.db import models from django.contrib.auth.models import User from datetime import datetime from uuid import uuid4 import string from string i

我试图通过django doc的帮助设置唯一的6位支票号码。但我仍然不希望期望的结果意味着它接受任何数字或字符,但我希望这将只接受6个整数,并确保该数字对所有用户都是唯一的

models.py

from django.db import models
from django.contrib.auth.models import User
from datetime import datetime
from uuid import uuid4
import string
from string import digits

class Mvouchar(models.Model):
cheque_no = models.CharField(max_length=6, null=True, blank=True, unique=True)
dated = models.DateTimeField(auto_now_add=True,null=True, blank=True)
def id_generator(size=6, chars=string.digits):
        return ''.join(random.choice(chars) for _ in range(size))

    def save(self):
        if not self.cheque_no:
            self.cheque_no = id_generator()
            while Mvouchar.objects.filter(cheque_no=self.cheque_no).exists():
                self.cheque_no = id_generator()
                self.dated = datetime.now()
        super(Mvouchar, self).save()    
    def __str__(self):
        if self.related:
            return self.related.relation.username.title()
        else:
            return 'no related!'
    class Meta:
            verbose_name_plural = "Single Cheque Multiple Vouchar Of Users"
views.py

def mvouchar(request):
            if request.method == "POST":
                userdata = User.objects.get(username = request.user)
                accountdata = Signs.objects.get(relation_id=userdata.id)
        chq_no = request.POST['chequeno']
        mini = Mvouchar(related_id=accountdata.id,  cheque_no = chq_no)
                mini.save()
                messages.success(request, "Your Cheque is Created") 
                return HttpResponseRedirect("/mvouchar/")           
            return render(request, 'cheque/mvouchar.html', {})

您应该使用ModelForm来验证发布的数据。由于您已在check\u no model字段上设置了
unique=True
,因此表单将为您检查

class MvoucharForm(forms.ModelForm):
    class Meta:
        fields = ('cheque_no',)

    def clean_cheque_no(self):
        cheque_no = form.cleaned_data['cheque_no']
        if not cheque_no.isdigit():
            raise forms.ValidationError('Please enter digits only')
        return cheque_no


不要忘了在模板中使用
form
,尤其是
{{form.errors}

在这样的示例中使用表单是标准的做法,但我还是考虑了您的示例并给出了我的解决方案。希望这对你有用

models.py:

##change modelfield type
class Mvouchar(models.Model):
  cheque_no = models.PositiveIntegerField(validators=[MaxValueValidator(6)], unique=True)
views.py:

def mvouchar(request):
            if request.method == "POST":
                userdata = User.objects.get(username = request.user)
                accountdata = Signs.objects.get(relation_id=userdata.id)
        chq_no = request.POST['chequeno']
        ##verify chq_no
        if len(chq_no)==6 and chq_no.isdigit():
           if Mvouchar.objects.filter(cheque_no =chq_no):
              ##raiseError chq_no is already exists and return
           ##your further code
        else:
           ##raiseError chq_no is wrongly typed

请在你的视图中修改缩进。对不起,我到现在还没有使用表单,而且我对表单也不太了解。我不明白这个更改是在models.py中完成的,还是制作另一个类似form.py的表单我能做什么我不知道你在问什么。您可以将表单放在任何您喜欢的地方,但是forms.py是标准的。文档完全涵盖了表单,您一定要阅读它,但我的代码应该按原样工作。我想知道我在models.py中做了哪些更改。。。。您首先为表单提供了代码。py n第二个是视图。py我做对了吗?感谢alot Nagesh Mhapadi了解我的问题,并提供了一个简单的解决方案,对我来说效果非常好……但我还是建议您通过表单。一旦你得到它,它将很容易实现这些事情。Django表单文档:hey Heard我收到了错误check\u no没有定义,但我的模型中有check\u no出了什么问题hearif Mvouchar.objects.all(check\u no=chq\u no):如果你喜欢这个解决方案,你可以投票回答:)
def mvouchar(request):
            if request.method == "POST":
                userdata = User.objects.get(username = request.user)
                accountdata = Signs.objects.get(relation_id=userdata.id)
        chq_no = request.POST['chequeno']
        ##verify chq_no
        if len(chq_no)==6 and chq_no.isdigit():
           if Mvouchar.objects.filter(cheque_no =chq_no):
              ##raiseError chq_no is already exists and return
           ##your further code
        else:
           ##raiseError chq_no is wrongly typed