Здравствуйте!
Пытаюсь создать динамический список для
choices в поле
symbol в форме. Сам список формируется во views и затем передается в конструктор формы. В форме все отображается правильно изначально, но при попытке добавить новое значение форма меняется как показано на рисунке. Что произошло?
Необходимо добавить в сhoises данные из модели Dictionary, но только те, которые нету в Requirement. Что делаю не так?
При загрузки cодержимое формы:
При попытки добавить (нажатие submit), содержимое формы меняется:
models.py:class Dictionary(models.Model):
symbol = models.CharField(_('Symbol'), max_length=250)
name = models.CharField(_('Name'), max_length=250)
class Requirement(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE)
symbol = models.CharField(_('Symbol'), max_length=250)
name = models.CharField(_('Name'), max_length=250)
forms.py:class RequirementForm(forms.ModelForm):
symbol = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple)
class Meta:
model = Requirement
fields = ('symbol',)
def __init__(self, final_list, *args, **kwargs):
super(RequirementForm, self).__init__(*args, **kwargs)
self.fields['symbol'].choices = [(x[0], x[1]) for x in final_list)]
views.py:def requirement_add(request, project_code):
data = dict()
project = get_object_or_404(Project, pk=project_code)
requirements = Requirement.objects.filter(project=project_code)
result = []
for x in requirements:
v = (x.symbol, x.name)
result.append(v)
full_result = [(x.symbol, x.name) for x in Dictionary.objects.all()]
final_list= list(set(full_result) ^ set(result))
if request.method == 'POST':
form = RequirementForm(request.POST, final_list)
if form.is_valid():
requirement_dict = dict(((x.symbol, x.name) for x in Dictionary.objects.all()))
symbols = form.cleaned_data.get('symbol')
requirement = form.save(commit=False)
for symbol in symbols:
requirement.project = project
requirement.symbol = symbol
requirement.name = requirement_dict [symbol]
requirement.pk = None
requirement.save()
data['form_is_valid'] = True
requirements = Requirement.objects.filter(project=project_code)
context = {'project': project, 'requirement': requirement, 'requirements': requirements}
data['html_requirement'] = render_to_string('project/requirement_list.html', context)
else:
data['form_is_valid'] = False
else:
form = RequirementForm(final_list)
context = {'project': project, 'form': form}
data['html_requirement_form'] = render_to_string('project/requirement_add.html', context, request=request)
return JsonResponse(data)