Как сгенерировать и распечатать несколько уникальных PIN-кодов пополнения счета в Django

Я работаю над проектом по продаже билетов, где я хочу, чтобы администратор мог генерировать несколько уникальных цифровых PIN-кодов, которые клиенты могут приобрести и могут быть подтверждены в приложении для регистрации на мероприятие. Вот моя модель билета

class Ticket(models.Model):
    name =models.CharField(max_length=50)
    price = models.PositiveIntegerField()
    pin = models.CharField(max_length=6)

    def __str__(self):
        return self.name

Мне нужна ситуация, в которой администратор мог бы генерировать несколько PIN-кодов для определенного билета одним щелчком мыши, но я не знаю, как это сделать, поэтому кто-нибудь должен помочь с лучшим способом сделать это.

Это для комментариев, но поскольку моя репутация не достигла 50, позвольте мне добавить следующее:

Если я вас понял, вы хотите, чтобы при отправке пользователем модели Ticket, Ticket автоматически генерировался случайный номер в админке.

Это можно сделать с помощью модуля Python под названием Random или с помощью модулей Django под названием Django Signals

Сигналы Django

Django включает в себя "диспетчер сигналов", который помогает развязанным приложениям получать уведомления о действиях, происходящих в других частях фреймворка. В двух словах, сигналы позволяют определенным отправителям уведомлять набор получателей о том, что произошло какое-то действие. Они особенно полезны, когда многие части кода могут быть заинтересованы в одних и тех же событиях

Python модуль Random

Этот модуль реализует генераторы псевдослучайных чисел для различных распределений.

Для целых чисел - равномерный выбор из диапазона. Для последовательностей есть равномерный выбор случайного элемента, функция для генерации случайной перестановки списка на месте и функция для случайной выборки без замены.

Вы должны создать другую модель TicketPIN, которая имеет ForeignKey отношение к Ticket модели:

from random import randint

from django.db import models

def generate_pin():
    return ''.join(str(randint(0, 9)) for _ in range(6))

class TicketPIN(models.Model):
    ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
    value = models.CharField(max_length=6, default=generate_pin, blank=True)

    class Meta:
        unique_together = ["ticket", "value"]

    def __str__(self):
        return f"{self.ticket} | {self.value}"

Вам не понадобится поле pin внутри модели Ticket. Далее необходимо создать представление, доступ к которому будет иметь только суперпользователь:

from django.http import JsonResponse

from .models import Ticket, TicketPIN

def generate_pins_for_ticket(request, ticket_id):
    if request.user.is_superuser:
        ticket = Ticket.objects.get(id=ticket_id)
        for _ in range(20):
            TicketPIN.objects.create(ticket=ticket)
        return JsonResponse({"message": f"Created 20 PINs successfully for {ticket} ticket."})
    return JsonResponse({"error": "Not Authorized"})

И в urls.py:

from django.urls import path

from .views import generate_pins_for_ticket 

urlpatterns = [
        path("generate-pins/<int:ticket_id>", generate_pins_for_ticket),
]

Допустим, администратор создал тикет, в котором есть id=1, когда администратор выходит из системы, любой пользователь, который посетит /generate-pins/1, увидит ответ {"error": "Not Authorized"}. Только если администратор вошел в систему и посетил /generate-pins/1, будет сгенерировано 20 PIN-кодов. Вы можете изменить представление, чтобы оно принимало любое число для генерации, и создать форму, чтобы она была удобной для администратора.

Вернуться на верх