我试图设置唯一的6位支票号码,帮助django医生。但我仍然不想要预期的结果,这意味着它接受任何数字或字符,但我希望它只接受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', {})发布于 2018-10-16 12:24:56
对这样的例子使用表单是标准的做法,但我还是考虑了您的示例并给出了解决方案。希望这对你有用。
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发布于 2018-10-16 08:06:04
您应该使用一个ModelForm来验证发布的数据。由于您已经在unique=True模型字段上设置了cheque_no,表单将为您检查这一点。
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..。
def mvouchar(request):
if request.method == "POST":
form = MvoucharForm(request.POST(
if form.is_valid():
accountdata = Signs.objects.get(relation=request.user)
mini = form.save(commit=False)
mini.related = accountdata
mini.save()
messages.success(request, "Your Cheque is Created")
return HttpResponseRedirect("/mvouchar/")
else:
form = MvoucharForm()
return render(request, 'cheque/mvouchar.html', {'form': form})不要忘记在模板中使用form,特别是{{ form.errors }}。
https://stackoverflow.com/questions/52829242
复制相似问题