简体   繁体   中英

Django form is not showing up on template

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM