Проблема с переопределением метода сохранения в 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)

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

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