Как сгенерировать и распечатать несколько уникальных 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-кодов. Вы можете изменить представление, чтобы оно принимало любое число для генерации, и создать форму, чтобы она была удобной для администратора.