Django Forms - Declarative Fields Meta class is not iterable
Why django throws me an error TypeError at /primary argument of type DeclarativeFieldsMetaclass is not iterable
.
I'm trying to work with django-forms
for the first time, after i added this into my forms.py
file, it keeps showing me the error message saying: TypeError at /primary argument of type 'DeclarativeFieldsMetaclass' is not iterable
, how can i solve this problem?
Forms.py
from django import forms
from .models import Primary, PrimaryAlbum, Secondary, SecondaryAlbum
from jsignature.forms import JSignatureField
from jsignature.widgets import JSignatureWidget
class PrimaryForms(forms.Form):
signature_of_student = JSignatureField(
widget=JSignatureWidget(
jsignature_attrs={'color':'#e0b642', 'height':'200px'}
)
)
class Meta:
model = Primary
fields = ['admission_number', 'profile_picture', 'first_name',
'last_name', 'gender', 'address_of_student', 'class_Of_student', 'signature_of_student']
Views.py
from .forms import PrimaryForms
class CreatePrimaryStudent(LoginRequiredMixin, CreateView):
model = Primary
fields = PrimaryForms
template_name = 'create_primary_student_information.html'
success_url = reverse_lazy('Home')
def get_form(self, form_class=None):
form = super().get_form(form_class)
form.fields['year_of_graduation'].queryset = PrimaryAlbum.objects.filter(user=self.request.user)
return form
def form_valid(self, form):
form.instance.user = self.request.user
return super(CreatePrimaryStudent, self).form_valid(form)
I solve my problem by changing it from fields = PrimaryForms
to form_class
in views.py
file under CreatePrimaryStudent
class, and for forms.py
file, I change the class method from: class PrimaryForms(forms.Form):
to class PrimaryForms(forms.ModelForm):
forms.py
class PrimaryForms(forms.ModelForm):
signature_of_student = JSignatureField(
widget=JSignatureWidget(
jsignature_attrs={'color':'#e0b642', 'height':'200px'}
)
)
signature_of_guardian = JSignatureField(
widget=JSignatureWidget(
jsignature_attrs={'color':'#e0b642', 'height':'200px'}
)
)
class Meta:
model = Primary
fields = ['admission_number', 'profile_picture', 'first_name',
'last_name', 'gender', 'address_of_student', 'class_Of_student', 'signature_of_student']
Views.py
class CreatePrimaryStudent(LoginRequiredMixin, CreateView):
model = Primary
form_class = PrimaryForms
template_name = 'create_primary_student_information.html'
success_url = reverse_lazy('Home')
def get_form(self, form_class=None):
form = super().get_form(form_class)
form.fields['year_of_graduation'].queryset = PrimaryAlbum.objects.filter(user=self.request.user)
return form
def form_valid(self, form):
form.instance.user = self.request.user
return super(CreatePrimaryStudent, self).form_valid(form)