Django - копирование и редактирование данных из одной модели в другую

У меня есть модель 'Services', которая содержит шаблонные услуги пользователя. У меня есть модель 'serviceSelect', которую я хочу иметь возможность скопировать и шаблон из 'Services' в модель 'ServiceSelect', которая затем будет связана с предложением и может быть отредактирована

У меня есть форма ServiceSelectForm, которая имеет начальные данные выпадающего списка из модели 'Service'. Я пытаюсь иметь возможность выбрать "услугу" из выпадающего списка и скопировать ее в модель 'ServiceSelect' для последующего редактирования.

Когда я пытаюсь сделать это, я получаю:


Cannot assign "'a303adbb9bd4'": "Proposal.services" must be a "ServiceSelect" instance.

Вот что я пробовал:

** Модель сервиса ** Имеется всего несколько записей, так как это шаблонные сервисы.


title = models.CharField(null=True, blank=True, max_length=100)
discription = models.TextField(null=True, blank=True)
category = models.CharField(choices=CATEGORY, blank=True, max_length=100)
quantity = models.FloatField(null=True, blank=True)
price = models.FloatField(null=True, blank=True)
paymentTerms = models.CharField(choices=PAYMENT, blank=True, max_length=100)
salesTax = models.CharField(choices=SALESTAX, blank=True, max_length=100)
uniqueId = models.CharField(null=True, blank=True, max_length=100)
slug = models.SlugField(max_length=500, unique=True, blank=True, null=True)
date_created = models.DateTimeField(blank=True, null=True)
last_updated = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return '{} {}'.format(self.title, self.uniqueId)
    
    
    def get_absolute_url(self):
        return reverse('product-detail', kwargs={'slug': self.slug})
    
    
    def save(self, *args, **kwargs):
        if self.date_created is None:
            self.date_created = timezone.localtime(timezone.now())
        if self.uniqueId is None:
            self.uniqueId = str(uuid4()).split('-')[4]
            self.slug = slugify('{} {}'.format(self.title, self.uniqueId))
    
        self.slug = slugify('{} {}'.format(self.title, self.uniqueId))
        self.last_updated = timezone.localtime(timezone.now())
    
        super(Services, self).save(*args, **kwargs)

** Модель "Услуги" (ServicesSelect) ** Это будут уникальные правки шаблонов в модели Services.


title = models.CharField(null=True, blank=True, max_length=100)
discription = models.TextField(null=True, blank=True)
category = models.CharField(choices=CATEGORY, blank=True, max_length=100)
quantity = models.FloatField(null=True, blank=True)
price = models.FloatField(null=True, blank=True)
paymentTerms = models.CharField(choices=PAYMENT, blank=True, max_length=100)
salesTax = models.CharField(choices=SALESTAX, blank=True, max_length=100)
uniqueId = models.CharField(null=True, blank=True, max_length=100)
slug = models.SlugField(max_length=500, unique=True, blank=True, null=True)
date_created = models.DateTimeField(blank=True, null=True)
last_updated = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        return '{} {}'.format(self.title, self.uniqueId)
    
    
    def get_absolute_url(self):
        return reverse('product-detail', kwargs={'slug': self.slug})
    
    
    def save(self, *args, **kwargs):
        if self.date_created is None:
            self.date_created = timezone.localtime(timezone.now())
        if self.uniqueId is None:
            self.uniqueId = str(uuid4()).split('-')[4]
            self.slug = slugify('{} {}'.format(self.title, self.uniqueId))
    
        self.slug = slugify('{} {}'.format(self.title, self.uniqueId))
        self.last_updated = timezone.localtime(timezone.now())
    
        super(Services, self).save(*args, **kwargs)

**ServiceSelectForm **

class ServiceSelectForm(forms.ModelForm):


    def __init__(self,*args,**kwargs):
        self.initial_service = kwargs.pop('initial_service')
        self.request = kwargs.pop('request')
        self.SERVICE_LIST = Services.objects.filter(team=self.request.team)
        self.SERVICE_CHOICES = [('-----', '--Select Services--')]


        for service in self.SERVICE_LIST:
            d_t = (service.uniqueId, service.title,)
            self.SERVICE_CHOICES.append(d_t)


        super(ServiceSelectForm,self).__init__(*args,**kwargs)

        self.fields['services'] = forms.ChoiceField(
                                        label='Choose services to add:',
                                        choices = self.SERVICE_CHOICES,
                                        widget=forms.Select(attrs={'class': 'form-control mb-3'}),)

    class Meta:
        model = Proposal
        fields = ['services']

    def clean_service(self):
        c_service = self.cleaned_data['services']
        if c_service == '-----':
            return self.initial_service
        else:
            return Services.objects.get(uniqueId=c_service)

**Релевантная часть представления при создании предложения: **

if request.method =='GET':
        service_form = ServiceSelectForm(initial_service=proposal.services,request=request)

....

 if request.method == 'POST':
        service_form = ServiceSelectForm(request.POST, initial_service=proposal.services,request=request, instance=proposal)

...
elif service_form.is_valid() and 'service' in request.POST:
            obj = service_form.save(commit=False)
            obj.team = request.team
            obj.save()
            messages.success(request, "Service added to Proposal")
            return redirect('proposals:build_proposal', team_slug=team.slug, slug=slug)
Вернуться на верх