Django моделирует уникальный банковский чек № 6 цифр - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь установить уникальный 6-значный контрольный номер с помощью django doc.но все же я не хочу, чтобы желаемый результат означал, что он принимает любое число или символ, но я хочу, чтобы он принимал только 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', {})

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Обычная практика - использовать формы для такого примера, но я все же рассмотрел ваш пример и дал свое решение.Надеюсь, что это работает для вас.

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
0 голосов
/ 16 октября 2018

Вы должны использовать 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 }}.

...