Проблема с переопределением метода сохранения в Django, который создает два разных идентификатора для встречи
Я переопределил метод сохранения для моей модели Meeting, который будет генерировать случайный id для meeting_ID всякий раз, когда пользователь создает встречу.
Сам метод сохранения работает успешно, но проблема в том, что каким-то образом переопределенный метод save() генерирует два случайных идентификатора вместо одного для созданной встречи. Это означает, что когда я нажимаю на кнопку Save, создается два одинаковых собрания с разными meeting_ID.
Я не знаю, в чем проблема, поскольку я новичок в Django.
Заранее спасибо.
Model.py
class Meeting(models.Model):
MEETING_STATUS = (
('Coming Soon', 'Coming Soon'),
('Live', 'Live'),
('Closed', 'Closed')
)
meeting_ID = models.CharField(primary_key=True, max_length=6, validators=[RegexValidator(r'^\d{6,6}$')], null=True)
meeting_title = models.CharField(max_length=400, null=True)
meeting_date = models.DateField()
meeting_time = models.TimeField()
meeting_desc = models.CharField(max_length=500, null=True)
meeting_status = models.CharField(max_length=200, null=True, choices=MEETING_STATUS)
date_created = models.DateTimeField(default=timezone.now, null=True)
def __str__(self):
return self.meeting_ID
def save(self, *args, **kwargs):
meetingID = random.randint(100000,999999)
if not Meeting.objects.filter(meeting_ID=str(meetingID)).exists():
self.meeting_ID = str(meetingID)
print(self.meeting_ID)
super(Meeting, self).save(*args,**kwargs)
class Resolutions_Meeting(models.Model):
reso_ID = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
resolution = models.CharField(max_length=400)
meeting_id = models.ForeignKey(Meeting, related_name="has_meetings", on_delete=CASCADE, null=False)
def __str__(self):
return str(self.meeting_id)
Views.py
class MeetingsCreate(CreateView):
model = Meeting
template_name = 'meetings/create_meetings.html'
# fields = ['meeting_ID', 'meeting_title', 'meeting_date', 'meeting_time', 'meeting_desc', 'meeting_status']
form_class = MeetingForm
success_url = None
def get_context_data(self, **kwargs):
data = super(MeetingsCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['meetings'] = ResolutionsFormSet(self.request.POST)
else:
data['meetings'] = ResolutionsFormSet()
return data
def form_valid(self, form):
context = self.get_context_data()
meetings = context['meetings']
with transaction.atomic():
self.object = form.save()
# print(self.object)
if meetings.is_valid():
meetings.instance = self.object
meetings.save()
return super(MeetingsCreate, self).form_valid(form)
def get_success_url(self):
return reverse_lazy('host_dashboard')
Ваш метод form_valid()
кажется неправильным: Очевидно, вы используете метод save()
дважды, поэтому создается два экземпляра. Первый метод save()
должен быть
form.save(commit=False)
поэтому вы не создаете экземпляр в базе данных. Это то, что делает commit = False
Это полезно, потому что вы можете манипулировать данными после размещения формы пользователем. Затем вы можете использовать второй метод save()
для создания экземпляра в базе данных.
Сейчас я не могу проверить ваш код, но я думаю, что он должен быть таким:
def form_valid(self, form):
context = self.get_context_data()
meetings = context['meetings']
with transaction.atomic():
self.object = form.save(commit=False)
# print(self.object)
if meetings.is_valid():
meetings.instance = self.object
meetings.save()
return super(MeetingsCreate, self).form_valid(form)
Если это не работает, значит, есть еще одна ошибка, кроме той, которую я упомянул. Я могу отредактировать свой ответ в этой ситуации.