Проблемы с обновлением формы Django информацией из другой модели
В основном я создаю функциональность для обновления формы значениями из одной таблицы в моем models.py, форма будет заполнять начальные значения из этой таблицы (leads) и после отправки информации, форма будет заполнять другую модель (leads)
Вот мой models.py
class Leads(models.Model):
project_id = models.BigAutoField(primary_key=True, serialize=False)
created_at = models.DateTimeField(auto_now_add=True)
expected_revenue = MoneyField(decimal_places=2,max_digits=14, default_currency='USD')
expected_licenses = models.IntegerField(blank=True)
country = CountryField(blank_label='(select_country)')
status = models.CharField(choices=[('Open', 'Open'), ('Closed', 'Closed'), ('Canceled', 'Canceled')], max_length=10)
estimated_closing_date = models.DateField(blank=True)
services = models.CharField(choices=[('Illumination Studies', 'Illumination Studies'),
('Training', 'Training'),('Survey Design Consultancy', 'Survey Design Consultancy'),
('Software License', 'Software License'),
('Software Development','Software Development')], max_length=40)
agent = models.ForeignKey(Profile, default='agent',on_delete=models.CASCADE)
company = models.ForeignKey(Company,on_delete=models.CASCADE)
point_of_contact = models.ForeignKey(Client, default='agent',on_delete=models.CASCADE)
updated_at = models.DateTimeField(auto_now=True)
class Deal(models.Model):
project_id = models.ForeignKey(Leads, on_delete=models.CASCADE, default='id')
agent = models.ForeignKey(Profile, on_delete=models.CASCADE, default="agent")
service = models.ForeignKey(Leads, on_delete=models.CASCADE, related_name='service')
closing_date = models.DateField(auto_now_add=True)
client = models.ForeignKey(Client, on_delete=models.CASCADE,default='client')
licenses = models.ForeignKey(Leads,on_delete=models.CASCADE, related_name='license')
revenue = MoneyField(max_digits=14, decimal_places=2, default_currency='USD')
comments = models.TextField(blank=True,null=True)
company = models.ForeignKey(Company, on_delete=models.CASCADE)
Forms.py
class NewDealForm(forms.ModelForm):
class Meta:
model = Deal
fields = ['project_id','agent','client','company','service', 'licenses','revenue','comments']
@login_required
def close_lead(request):
if request.method == 'POST':
deal_form = NewDealForm(request.POST)
print(deal_form)
if deal_form.is_valid():
deal_form.save()
messages.success(request, 'You have successfully updated the status from open to Close')
id = request.GET.get('project_id', '')
obj = Leads.objects.get(project_id=id)
obj.status = "Closed"
obj.save(update_fields=['status'])
return HttpResponseRedirect(reverse('dashboard'))
else:
messages.error(request, 'Error updating your Form')
else:
id = request.GET.get('project_id', '')
obj = get_object_or_404(Leads, project_id=id)
m = obj.__dict__
keys = Leads.objects.get(project_id=m['project_id'])
form_dict = {'project_id': keys.project_id,
'agent': keys.agent,
'client': keys.point_of_contact,
'company': keys.company,
'service': keys.services,
'licenses':keys.expected_licenses
}
print(form_dict)
form = NewDealForm(request.POST or None, initial=form_dict)
return render(request,
"account/close_lead.html",
{'form': form})
Мой вопрос в том, почему все значения заполнены, кроме поля service?
У кого-нибудь есть идеи, вывод моего словаря выглядит правильно, и он содержит информацию для сервиса, но почему-то это не передается в форму?
{'project_id': 1, 'agent': <Профиль: fcolina>, 'client': <Клиент: Zack M.>, 'company': <Компания: E3>, 'service': 'Software License', 'licenses': 3}
Как видите, услуга имеет фактическое значение
В вашей модели Deal
поле services
является внешним ключом к Leads
:
class Deal(models.Model):
service = models.ForeignKey(Leads)
И вы пытаетесь заполнить его значением поля services
в Leads
, которое является строкой.
class Leads(models.Model):
services = models.CharField()
Просматривая ваши модели, вам нужно заполнить поле services
экземпляром Leads
:
form_dict = {'project_id': keys.project_id,
'agent': keys.agent,
'client': keys.point_of_contact,
'company': keys.company,
'service': keys, # <-- point to Leads
'licenses':keys.expected_licenses
}