Как показать то же значение иностранного поля в панели администратора - имя поля это приз
Когда я генерирую код ваучера в имени класса уникальный код, мне нужно знать, как я могу показать то же значение поля приза в розыгрыше в соответствии с уникальным значением кода. Здесь мы можем видеть[ это панель администратора кода ваучера
это админпанель розыгрыша Теперь мне нужно такое же значение приза, как и в розыгрыше, в соответствии с уникальным кодом, Здесь мы видим на изображении, что должно быть justdo или 10% вместо nothing или sorry
models.py
import logging
import secrets
from django.db import models
from django.db.models.signals import post_save
Get an instance of a logger
logger = logging.getLogger(__name__)
class Draw(models.Model):
"""
Class to represent each valid draw that happened in the system.
"""
email = models.EmailField()
code = models.CharField(max_length=8)
sent = models.BooleanField(default=False)
rotation = models.IntegerField(default=0)
date = models.DateTimeField(blank=True, null=True)
prize = models.ForeignKey('Prize', on_delete=models.CASCADE, null=False, blank=False)
retry_used = models.BooleanField(default=False)
@classmethod
def post_create(cls, sender, instance, created, *args, **kwargs):
"""
Connected to the post_save signal of the UniqueCodes model. This is used to set the
code once we have created the db instance and have access to the primary key (ID Field).
"""
# If new database record
if created:
# We have the primary key (ID Field) now so let's grab it
id_string = str(instance.id)
# Save the class instance
instance.save()
def __str__(self):
return f"{self.email} - {self.code}"
def use_retry(self):
logger.info("use_retry!!!!!")
self.retry_used = True
self.save()
Connect the post_create function to the UniqueCodes post_save signal
post_save.connect(Draw.post_create, sender=Draw)
class UniqueCode(models.Model):
"""
Class to create human friendly gift/coupon/voucher codes.
"""
# Model field for our unique code
code = models.CharField(max_length=20, blank=True, null=True, unique=True, default="Automatic
Generated", editable=False)
used = models.BooleanField(default=False)
date = models.DateTimeField(blank=True, null=True, auto_now_add=True)
prize = models.ForeignKey('Prize', on_delete=models.CASCADE, null=True, blank=False)
@classmethod
def post_create(cls, sender, instance, created, *args, **kwargs):
# If new database record
if created:
# We have the primary key (ID Field) now so let's grab it
id_string = str(instance.id)
# Define our random string alphabet
# (notice I've omitted I,O,etc. as they can be confused for other characters)
upper_alpha = "ABCDEFGHJKLMNPQRSTVWXYZ"
# Create an 8 char random string from our alphabet
random_str = "".join(secrets.choice(upper_alpha) for i in range(8))
# Append the ID to the end of the random string
instance.code = (random_str + id_string)[-8:]
# Save the class instance
instance.save()
def __str__(self):
return f"{self.code} [Used: {self.used}]"
post_save.connect(UniqueCode.post_create, sender=UniqueCode)
class Prize(models.Model):
label = models.CharField(max_length=20)
winner = models.BooleanField(default=False)
try_again = models.BooleanField(default=False)
def __str__(self):
return self.label
views.py
import logging
from app.draw import calc_wheel_rotations, get_prize_result, is_code_valid, set_code_used,
get_prize
from app.forms import DrawForm
from app.models import Draw, Prize
from django.shortcuts import render, redirect, get_object_or_404, get_list_or_404
from django.utils import timezone
# Get an instance of a logger
logger = logging.getLogger(__name__)
def draw_spin(request):
logger.info(f"Draw_new with {request.method}")
prizes = get_list_or_404(Prize)
if request.method == "POST":
form = DrawForm(request.POST)
if form.is_valid(): # and code is valid (checked on form class)
email = form.cleaned_data['email']
code = form.cleaned_data['code']
logger.info(f"email [{email}] code [{code}]")
instance = form.save(commit=False)
instance.date = timezone.now()
instance.rotation = calc_wheel_rotations()
instance.prize = get_prize(get_prize_result(instance.rotation))
instance.save()
set_code_used(code, True)
return render(request, 'index.html',
{'spin': True, 'result': instance.pk, 'rotation': instance.rotation,
'prizes': prizes})
else: # invalid form
logger.warning(f"invalid form else => {form.is_valid()}")
logger.warning(f"invalid form else => {form.errors}")
form = DrawForm(request.POST)
else:
form = DrawForm() # No post data
return render(request, 'index.html', {'form': form, 'prizes': prizes})
def draw_result(request, pk):
prizes = get_list_or_404(Prize)
draw = get_object_or_404(Draw, pk=pk)
logger.info(f"Draw with {request.method} for id {draw.pk}")
prize = get_prize(draw.prize.pk)
logger.info(f"Prize {prize.pk}, {prize.label}, {prize.winner}")
if prize.try_again:
set_code_used(draw.code, False)
return render(request, 'draw.html', {'prizes': prizes, 'result_draw': draw, 'result_prize':
prize})
def index(request):
form = DrawForm()
prizes = get_list_or_404(Prize)
return render(request, 'index.html',
{'form': form, 'prizes': prizes})