Лучший способ создать выпадающий список значений из одной модели и сохранить его как текст в поле Charfield той же модели
У меня есть модель "TnaTemplateModel"
class TnaTemplateModel(models.Model):
id = models.UUIDField(primary_key = True,default=uuid.uuid4, editable=False)
template_name = models.ForeignKey(TemplateNameModel, verbose_name="template name", null=False,
blank=False, on_delete=models.CASCADE, help_text="Select the template")
process_name = models.ForeignKey(ProcessModel, verbose_name="process name", null=False,
blank=False, on_delete=models.CASCADE, help_text="Select the process")
sequence = models.IntegerField(verbose_name="Process Sequence",null = False,blank = False)
is_base = models.BooleanField()
dependent_process = models.CharField(verbose_name="Dependent Process",null=True, blank= True,max_length= 150)
formula = models.IntegerField(verbose_name="Formula", null= True,blank = True)
remarks = models.CharField(verbose_name="Process remarks", null= True, blank = True,max_length= 300)
class Meta:
unique_together = ["template_name", "process_name"]
def __str__(self):
return str(self.template_name)
Мне нужно сохранить записи из формы, где поле dependent_process будет списком всех процессов в TNATemplateModel с нужным именем template_name и где is_base = True. Для этого я создал 2 представления и 2 формы, по 1 для сохранения всех записей с is_base = True и 2 для сохранения записей, которые будут иметь зависимый_процесс в виде выпадающего списка из ранее добавленных процессов с is_base = true. Обратите внимание, что выпадающий список должен показывать процессы с одинаковым именем шаблона, где is_base = True.
Views.py
#for saving processes with is_base = true
def baseprocesscreatenew(request,pk):
template_name = TemplateNameModel.objects.get(id=pk)
data = {'template_name': template_name.id,'is_base': True}
dependent_list = TnaTemplateModel.objects.filter(template_name = template_name.id)
if request.method == 'POST':
form = BaseProcessModelformNew(request.POST,initial= data)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('templatepointslist_new',kwargs={'pk':pk}))
else:
form = BaseProcessModelformNew(initial= data)
print(form.errors)
return render (request,"tna/template_tna/baseprocessmodel_create.html",{'form':form,'dependent_list':dependent_list})
#for saving dependent processes
def dependentprocesscreatenew(request,pk):
template_name = TemplateNameModel.objects.get(id=pk)
data = {'template_name': template_name.id,'is_base': False}
dependent_list = TnaTemplateModel.objects.filter(template_name = template_name.id)
if request.method == 'POST':
form = DependentProcessModelformNew(request.POST,initial= data)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('templatepointslist_new',kwargs={'pk':pk}))
else:
form = DependentProcessModelformNew(initial= data)
print(form.errors)
return render (request,"tna/template_tna/dependentprocessmodelnew_create.html",{'form':form,'dependent_list':dependent_list})
** forms.py **
#form for saving base process
class BaseProcessModelformNew(forms.ModelForm):
class Meta:
model = TnaTemplateModel
fields =('__all__')
widgets = {'template_name': forms.HiddenInput(),'dependent_process:':forms.HiddenInput(),
'formula':forms.HiddenInput(),'is_base':forms.HiddenInput()}
#for Saving Dependent process
class DependentProcessModelformNew(forms.ModelForm):
class Meta():
model = TnaTemplateModel
fields =('__all__')
widgets = {'template_name': forms.HiddenInput(),
'is_base':forms.HiddenInput()}
def __init__(self,*args,**kwargs):
template_id= kwargs['initial']['template_name']
tna_template_name = TemplateNameModel.objects.get(id= template_id)
super (DependentProcessModelformNew,self ).__init__(*args,**kwargs)
dependent_obj_list = TnaTemplateModel.objects.filter(template_name = tna_template_name,is_base=True)
print("*************",dependent_obj_list)
def convert_queryset_tuple(obj):
dependent_list=[]
for a in obj:
dependent_list.append[a.process_name]
return tuple(dependent_list)
dependent_list = convert_queryset_tuple(dependent_obj_list)
self.fields['dependent_process'] = forms.ChoiceField(choices=dependent_list)
Я пробовал несколько подходов к этой проблеме. Я пытался создать отдельную модель для базового и зависимого процесса, но поскольку мне нужно вычислить даты для зависимого процесса, которые будут зависеть от дат, введенных в базовом процессе, я не смог понять, как я могу сделать это с помощью двух разных моделей. После создания одной модели для базового процесса я не могу понять :
- Как я могу передать зависимый список в html-шаблон и создать выпадающий список, поскольку я использую форму django .
- Если я использую ChoiceField, я не могу получить динамический кортеж из набора запросов, и я считаю, что ChoiceField не может быть создан без кортежа .
Я потратил много времени, пытаясь найти наилучший способ достижения, и я стремлюсь найти наилучший подход для этого.