I am trying to show two forms ( UserRegisterForm
and TeacherRegisterForm
) in one template. But, only the UserRegisterForm
is showing up in the rendered HTML.
teacher-register.html
<form enctype="multipart/form-data" action="" method="post">
{% csrf_token %}
{% crispy user_form %}
{% crispy teacher_form %}
<div class="form-group mt-3">
<button class="btn btn-outline-info" type="submit">Sign Up</button>
</div>
</form>
urls.py
urlpatterns = [
path('login/', LoginView.as_view(template_name='accounts/login.html'), name='login'),
path('register/', register, name='register'),
path('TeacherRegister/', register_teacher, name='teacher-register'),
path('logout/', sign_out, name='logout'),
path('profile/', sign_out, name='logout'),
]
views.py
def register_teacher(request):
if request.user.is_authenticated:
return redirect('dashboard')
if request.method == 'POST':
user_form = UserRegisterForm(request.POST)
teacher_form = TeacherRegisterForm(request.POST,
request.FILES)
if user_form.is_valid() and teacher_form.is_valid():
user = user_form.save(commit=False)
user.is_student = False
user.is_teacher = True
user.save()
profile = teacher_form.save(commit=False)
profile.user = user
profile.save()
messages.success(
request, f'Your account has been created!')
return redirect('login')
else:
user_form = UserRegisterForm()
teacher_form = TeacherRegisterForm()
context = {
'user_form': user_form,
'teacher_form': teacher_form,
}
return render(request, 'accounts/teacher-register.html', context)
forms.py
class TeacherRegisterForm(forms.ModelForm):
image = forms.ImageField(
label='Profile Picture',
help_text='Upload a recent clear image.',
required=False,
)
birth_date = forms.DateField(
label='Birth Date',
widget=forms.widgets.DateInput(attrs={'type': 'date'}),
)
facebook = forms.URLField(
label='Facebook Profile URL'
)
class Meta:
model = Teacher
fields = [
'image',
'birth_date',
'facebook',
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_tag = False
self.helper.layout = Layout(
Div(
Div('image', css_class="col-sm-6"),
Div('birth_date', css_class="col-sm-6"),
css_class='row',
),
FloatingField('facebook'),
)
models.py
class Teacher(models.Model):
user = models.OneToOneField(User,
on_delete=models.CASCADE,
primary_key=True)
image = models.ImageField(
default='profile_pics/default.jpg', upload_to=location, blank=True)
birth_date = models.DateField(null=True)
facebook = models.URLField(null=True, blank=True)
courses = models.ManyToManyField(Course,
related_name='teachers',
blank=True)
sessions = ChainedManyToManyField(Session,
chained_field='courses',
chained_model_field='course',
related_name='teachers',
blank=True)
batches = ChainedManyToManyField(Batch,
chained_field='sessions',
chained_model_field='session',
horizontal=True,
related_name='teachers',
blank=True)
last_updated = models.DateTimeField(auto_now=True)
def __str__(self):
return f'{self.user.first_name} {self.user.last_name}'
I did the same thing for student-register.html
template and it's working fine. I've searched for hours but couldn't find any bug in my code.
EDIT:
In views.py , if I set teacher_form = StudentRegisterForm()
, the StudentRegisterForm
appears in the teacher-register.html
template. So, I guess the problem might be somewhere in the class TeacherRegisterForm()
I somehow had this code way below in my forms.py file:
class TeacherRegisterForm(forms.ModelForm):
class Meta:
model = Teacher
fields = []
I have no idea where it came from. It was overriding my main TeacherRegisterForm()
class, which is why no fields were appearing in the template.
Removing it solved the problem.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.