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)