Как передать значение в форму (python django)
У меня есть 2 модели. Сard и Client. Отношение у них один ко многим. Моя задача, реализовать регистрацию Client и чтобы автоматический к нему создавалась карта с рандомно заполненными значениями. Я только на стадии изучения django и не знаю как это реализовать. Буду очень благодарен за примеры кода с описанием.
models.py
class Card(models.Model):
number = models.CharField(max_length=16, null=False, verbose_name='номер')
pin_code = models.CharField(max_length=4, null=False, verbose_name='пинкод')
money = models.CharField(max_length=255,default=0, verbose_name='деньги')
def __str__(self):
return self.number
class Client(models.Model):
first_name = models.CharField(max_length=15, null=False, verbose_name='имя')
last_name = models.CharField(max_length=15, null=False, verbose_name='фамилия')
middle_name = models.CharField(max_length=15, null=False, verbose_name='отчество')
card = models.ForeignKey(Card, null=False, on_delete=models.CASCADE, verbose_name='карта')
def __str__(self):
return f'{self.first_name} {self.last_name} {self.middle_name}'
forms.py
from TIbank.models import Client, Card
class PostForm(forms.ModelForm):
class Meta:
model = Client
exclude = 'card',
views.py
def authorization(request):
form = PostForm(request.POST)
if form.is_valid():
form.save()
context = {
'form': PostForm()
}
return render(request, 'TIbank/authorization.html', context=context)
Я пытался создавать отдельно карту и передавать ее в Client. Но ловил ошибку.
Ответы (1 шт):
Это можно сделать с помощью сигналов:
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=Client)
def create_random_card(sender, instance, *args, **kwargs):
# проверяем, что у объекта нет ключа,
# т.е. что это именно создание, а не модификация
if not instance.pk:
card = Card.objects.create(
number = ..., # тут должны быть значения полей
pin_code = ...)
instance.card = card
Сигналы позволяют делать действия в определенные моменты. В данном случае сигнал pre_save, т.е. он срабатывает перед сохранением объекта, в данном случае Client. instance - это объект, который будет сохранен. Мы ему тут назначаем карту, которую тут же и создали.