Search code examples
pythondjangoinsert

Django Error : ValueError at / Field 'ticket_id' expected a number but got 'NS000001'


While Inserting data, I got this error. May be this could be due to change of default primary key. I do not want to enter ticket_id field as I have set default value for that field (default='NS000001')

models.py

class Ticket(models.Model):
    ticket_id = models.AutoField(primary_key=True, default='NS000001', editable=False)
    server_details = models.CharField(max_length=100)
    send_date = models.DateTimeField(default=timezone.now)
    license_no = models.CharField(max_length=25)
    file = models.FileField(upload_to='documents/%Y/%m/%d/')
    
    def __str__(self):
        return self.ticket_id

views.py

def Index(request):
    if request.method == "POST":
        form = SaveTicket(request.POST,request.FILES or None) 
        if form.is_valid():
            form.save()
            print(form)
            return redirect('index')
    else:
        form = SaveTicket()
    return render(request, 'index.html')

forms.py

class SaveTicket(forms.ModelForm):
    class Meta:
        model = Ticket
        fields = ['server_details','send_date','license_no','file']

Solution

  • first

    you don't need define Autofield yourself.

    class Ticket(models.Model):
        server_details = models.CharField(max_length=100)
        send_date = models.DateTimeField(default=timezone.now)
        license_no = models.CharField(max_length=25)
        file = models.FileField(upload_to='documents/%Y/%m/%d/')
    

    second

    If your Ticket ID is static - you can create a property:

    class Ticket(models.Model):
    
        ...  # any staff here
    
        @property
        def ticket_id(self):
            return f'NS{(self.pk or 0):06d}'
    

    last

    after that you can use it everywhere:

    print(ticket.ticket_id)
    >>>'NS2134154'