almutairi
almutairi

Reputation: 37

How to pass two forms from one generic class in django

I want to pass two forms in one HTML template, I have two different models User and profile

models.py:

class Profile(models.Model):
user = models.OneToOneField(User,null=True,on_delete=models.CASCADE)
home_phone = models.CharField(max_length=20, blank=True, null=True)
mobile_phone = models.CharField(unique=True, max_length=20,null=True)
personal_id = models.CharField(max_length=30, blank=True, null=True)
address_line_1 = models.CharField(db_column='address_Line_1', max_length=200,null=True)  # Field name made lowercase.
address_line_2 = models.CharField(db_column='address_Line_2', max_length=200, blank=True, null=True)  # Field name made lowercase.
city = models.CharField(max_length=50,null=True)
country_fk = models.ForeignKey('Country', models.DO_NOTHING, db_column='country_FK',null=True)  # Field name made lowercase.
gender_fk = models.ForeignKey('Gender', models.DO_NOTHING, db_column='gender_FK',null=True)  # Field name made lowercase.
bdate = models.DateField(blank=True,null=True)

def __str__(self):
    return str(self.user)

members views.py

class UserEditView(generic.UpdateView):
form_class = EditProfileForm
template_name = 'registration/edit_profile.html'
success_url = reverse_lazy('home')

def get_object(self):
   return self.request.user 

members forms.py

class EditProfileForm(UserChangeForm):

email = forms.EmailField(widget=forms.EmailInput(attrs={'class':'form-control'}))
first_name = forms.CharField(max_length=100, required=True, widget=forms.TextInput(attrs={'class':'form-control'}))
last_name = forms.CharField(max_length=100, required=False,widget=forms.TextInput(attrs={'class':'form-control'}))
username = forms.CharField(max_length=100, required=False,widget=forms.TextInput(attrs={'class':'form-control'}))


class Meta:
    model = User
    fields = ('username','first_name','last_name','email','password')

class ProfileForm(ModelForm):
Years =  [x for x in range(1940,2021)]
home_phone = forms.IntegerField(min_value=10000000,max_value=999999999,required=False,widget=forms.NumberInput(attrs={'class':'form-control'}))
mobile_phone = forms.IntegerField(min_value=10000000,max_value=999999999,required=False,widget=forms.NumberInput(attrs={'class':'form-control'}))
personal_id = forms.IntegerField(min_value=100000000000,max_value=9999999999999,required=False,widget=forms.NumberInput(attrs={'class':'form-control'}))
address_line1 = forms.CharField(max_length=100, required=True, widget=forms.TextInput(attrs={'class':'form-control'}))
address_line2 = forms.CharField(max_length=100, required=False,widget=forms.TextInput(attrs={'class':'form-control'}))
city = forms.CharField(max_length=100, required=True,widget=forms.TextInput(attrs={'class':'form-control'}))
Country = forms.ModelChoiceField(queryset=Country.objects,required=True,label=_('Country'))
gender = forms.ModelChoiceField(queryset=Gender.objects,required=True,label=_('Gender'))
bdate = forms.DateField(widget=forms.SelectDateWidget(years=Years))

class Meta:
    model = Profile
    fields = ('address_line_1','address_line_2','bdate','city','country_fk','gender_fk','home_phone','mobile_phone','personal_id')

I want both forms show in my template to save the user information in User model and Profile model

Upvotes: 1

Views: 46

Answers (1)

hendrikschneider
hendrikschneider

Reputation: 1846

You can use a MultiformView to use multiple forms in a form view.

Checkout this package: https://github.com/TimBest/django-multi-form-view

Upvotes: 1

Related Questions