0

Я пытаюсь создать динамическую форму после проверки некоторого условия в представлении, и я не уверен, как подойти к нему. Как заполнить атрибут полей в метафайлах форм из моих представлений?Динамическое обновление полей Meta-класса ModelForm с использованием представлений

Ниже представлены мои view.py и мои файлы forms.py.

views.py

Как я заполнить список полей в forms.py из моих взглядов?

from django.shortcuts import render, get_object_or_404 
    from django.http import HttpResponse 
    from django import forms 

    from .models import Master, Label, Assosiative 
    from .forms import LabelForm, MzasterForm, AssosiativeForm 

    def master(request,pk): 
     associate = get_object_or_404(Assosiative, pk=pk) 
     form = MasterForm(request.POST or None) 
     if associate.short_text1 == 1: 
      form.fields['short_text1'] = forms.CharField(label='Short text 1') 
     if associate.short_text2 == 1: 
      form.fields['short_text2'] = forms.CharField(label='Short text 2') 
     if associate.short_text3 == 1: 
      form.fields['short_text3'] = forms.CharField(label='Short text 3') 
     if associate.short_text4 == 1: 
      form.fields['short_text4'] = forms.CharField(label='Short text 4') 
     if associate.num_field1 == 1: 
      form.fields['num_field1'] = forms.CharField(label='Number field 1') 
     if associate.num_field2 == 1: 
      form.fields['num_field2'] = forms.CharField(label='Number field 2') 
     if form.is_valid(): 
      try: 
       short_text1 = form.cleaned_data['short_text1'] 
       short_text2 = form.cleaned_data['short_text2'] 
       short_text3 = form.cleaned_data['short_text3'] 
       short_text4 = form.cleaned_data['short_text4'] 
       num_field1 = form.cleaned_data['num_field1'] 
       num_field2 = form.cleaned_data['num_field2'] 
       form.save() 
      except Exception, ex: 
     return HttpResponse("Error %s" %str(ex)) 
     return render(request, 'master.html', {'form':form,}) 

forms.py

Я не уверен, что делать здесь, так что я могу заполнить поля из моих взглядов

def masterForm(fields_list, *args, **kwargs): 
     class MasterForm(forms.ModelForm): 
      class Meta: 
       model = Master 
       fields = fields_list 
      def __init__(self): 
       super(MasterForm, self).__init__(*args, **kwargs) 
     return MasterForm() 
    joke = masterForm(('short_text1',)) 
+0

[Этот вопрос] (http://stackoverflow.com/questions/297383/dynamically -update-modelforms-meta-class) может помочь. – Alasdair

+0

Я попытался реализовать, поскольку этот вопрос объясняет, но все же он не работает – Hamfri

+2

Что «не работает»? Попробуйте более простую версию 'def get_form (exclude_list):', я думаю, что яснее, когда вы создаете класс формы, затем создавайте его как два отдельных шага. – Alasdair

ответ

0

Как и в this question, вы можете определить метод, который создает класс формы. Если посмотреть на свое мнение, вы создаете поля один за другим на основе associate вместо создания списка полей. Поэтому я бы использовал associate в качестве аргумента для вашего метода get_form_class.

def get_form_class(fields_list): 
    class MasterForm(ModelForm): 
     class Meta: 
      model = Master 
      fields = fields_list 
     ... 
    return MasterForm 

Затем, на ваш взгляд, использовать get_form создать класс формы динамически, то создать его экземпляр.

def master(request, pk): 
    associate = get_object_or_404(Assosiative, pk=pk) 
    fields_list = [] 
    if associate.short_text1 == 1: 
     fields_list.append('short_text1') 
    if associate.short_text2 == 1: 
     fields_list.append('short_text2') 
    MasterForm = get_form_class(fields_list) 
    form = MasterForm(request.POST or None) 
    if form.is_valid(): 
     ... 
+0

ваш ответ помог мне, однако мне пришлось немного подкорректировать, как в коде ниже – Hamfri

+0

Спасибо, что ваш ответ мне помог. Теперь единственная проблема, с которой я сталкиваюсь, заключается в том, что когда я отправляю данные, она отправляется в виде нулевых значений в базу данных, а также если я не включаю ** fields = [] ** в ** класс Meta ** django жалуется ** Создание ModelForm без атрибута «fields» или «exclude» запрещен; Форма MasterForm нуждается в обновлении ** – Hamfri

+0

'class Master (models.Model): short_text1 = models.CharField (max_length = 100, blank = True, null = True) short_text2 = models.CharField (max_length = 100, blank = True , null = True) short_text3 = models.CharField (max_length = 100, blank = True, null = True) short_text4 = models.CharField (max_length = 100, blank = True, null = True) num_field1 = models.IntegerField (blank = True, null = True) num_field2 = models.IntegerField (blank = True, null = True) ' – Hamfri

0

Чтобы создать форму динамически после проверки некоторого условия

views.py

def master(request, pk): 
     associate = get_object_or_404(Assosiative, pk=pk) 
     MasterForm = get_form_class(associate) 
     form = MasterForm(request.POST or None) 
     if form.is_valid(): 
      form.save() 
      messages.add_message(request, messages.INFO, 'Your Form has been posted successfully') 
      return HttpResponseRedirect('/') 
     return render(request, 'master.html', locals()) 

Динамически добавить поля формы к полям списка класса Meta в forms.py

def get_form_class(associate, *args, **kwargs): 
     class MasterForm(forms.ModelForm): 
      def __init__(self, *args, **kwargs): 
       super(MasterForm,self).__init__(*args, **kwargs) 
      class Meta: 
       model = Master 
       fields = [] #initialize an empty fields list 
       # Append items to the fields list after checking some condition 
       if associate.short_text1 == 1: 
        fields.append('short_text1') 
       if associate.short_text2 == 1: 
        fields.append('short_text2') 
       if associate.short_text3 == 1: 
        fields.append('short_text3') 
       if associate.short_text4 == 1: 
        fields.append('short_text4') 
       if associate.num_field1 == 1: 
        fields.append('num_field1') 
       if associate.num_field2 == 1: 
        fields.append('num_field2')    
     return MasterForm 
Смежные вопросы