@nurzhannogerbek

Почему содержимое формы меняется?

Здравствуйте!

Пытаюсь создать динамический список для choices в поле symbol в форме. Сам список формируется во views и затем передается в конструктор формы. В форме все отображается правильно изначально, но при попытке добавить новое значение форма меняется как показано на рисунке. Что произошло?

Необходимо добавить в сhoises данные из модели Dictionary, но только те, которые нету в Requirement. Что делаю не так?

При загрузки cодержимое формы:
5432813944914733a6efb663bc2ed44f.PNG

При попытки добавить (нажатие submit), содержимое формы меняется:
62e94e2b7a8e4192981917ccc6f7bce4.PNG

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)
  • Вопрос задан
  • 216 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы