0

Ich versuche ein dynamisches Formular zu erstellen, nachdem ich eine Bedingung in der Ansicht überprüft habe und bin mir nicht sicher, wie ich es angehen soll. Wie befülle ich das Attribut fields in der Meta-Klasse forms aus meinen Ansichten?Dynamische Aktualisierung von ModelForms Meta-Klassenfeldern mit Sichten

Unten sind meine views.py und meine forms.py Dateien.

views.py

Wie füllen wir die Listenfelder in forms.py von meinen Ansichten?

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

Ich bin nicht sicher, was hier zu tun, so dass ich die Felder aus meinen Ansichten bevölkern kann

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

[Diese Frage] (http://stackoverflow.com/questions/297383/dynamically -update-modelforms-meta-class) könnte helfen. – Alasdair

+0

Ich habe versucht zu implementieren, wie diese Frage erklärt, aber immer noch nicht funktioniert – Hamfri

+2

Was "funktioniert nicht"? Versuchen Sie die einfachere Version 'def get_form (exclude_list):', Ich denke, es ist klarer, wenn Sie die Formularklasse erstellen und dann in zwei separaten Schritten instanziieren. – Alasdair

Antwort

0

Wie in this question, können Sie eine Methode definieren, erstellt die Formularklasse. Wenn Sie Ihre Ansicht betrachten, scheinen Sie Felder basierend auf associate nacheinander zu erstellen, anstatt eine Liste von Feldern zu erstellen. Daher würde ich associate als ein Argument für Ihre get_form_class Methode verwenden.

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

Dann Ihrer Ansicht nach, verwenden Sie die get_form die Formularklasse dynamisch zu erstellen, dann ist es instanziiert.

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

Ihre Antwort heped mich, aber ich musste ein wenig wie im Code unter – Hamfri

+0

zwicken Vielen Dank Ihre Antwort hat mir geholfen. Jetzt das einzige Problem, das ich habe, ist, dass, wenn ich Daten poste als NULL-Werte in die Datenbank gebucht und auch wenn ich nicht ** Felder = [] ** in der ** Klasse Meta ** Django beschwert ** erstellen ein ModelForm ohne das Attribut 'fields' oder das Attribut 'exclude' ist verboten; Formular MasterForm muss aktualisiert werden. ** – Hamfri

+0

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

0

Formular erstellen dynamisch nach einer Bedingung

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()) 

dynamisch hinzufügen Formularfelder zu den Feldern Überprüfung Liste Klasse Meta in 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 
Verwandte Themen