【问题标题】:ChoiceFields to give two different forms or different fields in html template and djangoChoiceFields 在 html 模板和 django 中给出两种不同的形式或不同的字段
【发布时间】:2021-12-04 08:09:45
【问题描述】:

我正在尝试为牙医和学生制作注册表,其中我有一个牙医和学生的选择字段。我想要发生的是,当牙医被选中时,我应该能够在HTML中看到987654322 @ field,以及django选择该表格,以及为学生选择student_emailinstitution。我对如何在模板中编写它的代码感到困惑,我几乎到处寻找,找不到任何可以帮助我想要的东西。我还包含了一张带有注册图像外观的图像。我知道我可以在 html 模板中使用selectoption,但仍然对它们有些困惑。如果你能告诉我一个更好的方法来应用我的想法,请告诉我。

form.py

from django import forms
from django_countries.fields import CountryField


class RegistrationForm(forms.Form):

   Specialties = [
       ('pediatric','Pediatric'),
       ('oral surgeon','Oral Surgeon'),
       ('periodontist','Periodontist (Restorative; Esthetic)'),
       ('orthodontist','Orthodonsit'),
       ('endodontist','Endodontist'),
       ('prosthodontist','Prosthodontist'),
       ('oral pathologist','Oral Pathologist'),
       ('oral radiologist','Oral Radiologist'),
       ('public health dentist','Public Health Dentist'),
       ('research and academics','Research and Academics'),
   ]

   username = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}), required=True, unique=True)
   email = forms.EmailField(widget=forms.EmailInput(attrs={'class':'form-control'}), required=True, unique=True)
   student_email = forms.EmailField(widget=forms.EmailInput(attrs={'class':'form-control'}), required=True, unique=True)
   password = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control'}), required=True)
   password_repeat = forms.CharField(widget=forms.PasswordInput(attrs={'class':'form-control'}), required=True)
   first_name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}), required=True)
   last_name = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}), required=True)
   date_of_birth = forms.DateField(label = "Date of Birth", widget=forms.SelectDateWidget([x for x in range(1920,2021)]), required=True)
   country = CountryField().formfield(required=True)
   gender = forms.ChoiceField(widget=forms.RadioSelect, choices=[('male','Male'),('female','Female')], required=True)
   specialty = forms.CharField(widget=forms.Select(choices= Specialties), required=True)
   institution = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control'}), required=True)
   dentist_or_student = forms.ChoiceField(widget=forms.RadioSelect, choices=[('dentist','Dentsit'),('student','Student')], required=True)

   def clean_student_email(self):

       data = self.cleaned_data['student_email']
       if "@edu" not in data: #Check if the student's email is educational or not
           raise forms.ValidationError("Email must be @edu")
       return data

views.py

def user_register(request):
    template_name = 'accounts/signup.html'

    if request.method == 'POST':
        
        form = RegistrationForm(request.POST)
        
        # Check for validity
        if form.is_valid():
            if form.cleaned_data['dentist_or_student'] == 'dentist':

                if User.objects.filter(username=form.cleaned_data['username']).exists():
                    return render(request, template_name, {
                        'form': form,
                        'error_message': 'Username already exists'
                    })
                elif User.objects.filter(email=form.cleaned_data['email']).exists():
                    return render(request, template_name, {
                        'form': form,
                        'error_message': 'Email already exists'
                    })
                elif form.cleaned_data['password'] != form.cleaned_data['password_repeat']:
                    return render(request,template_name, {
                        'form': form,
                        'error_message': 'Passwords do not match'
                    })
                else:
                    # Create the user
                    user = User.objects.create_user(
                        form.cleaned_data['username'],
                        form.cleaned_data['email'],
                        form.cleaned_data['password']
                    )
                    user.first_name = form.cleaned_data['first_name']
                    user.last_name = form.cleaned_data['first_name']
                    user.dentist_or_student = form.cleaned_data['dentist']
                    user.date_of_birth = form.cleaned_data['date_of_birth']
                    user.country = form.cleaned_data['country']
                    user.gender = form.cleaned_data['gender']
                    user.save()

                    # Login the user
                    login(request, user)

                    # redirect to Homepage
                    return HttpResponseRedirect('home')

            elif form.cleaned_data['dentist_or_student'] == 'student':
                if User.objects.filter(username=form.cleaned_data['username']).exists():
                    return render(request, template_name, {
                        'form': form,
                        'error_message': 'Username already exists'
                    })
                elif User.objects.filter(email=form.cleaned_data['student_email']).exists():
                    return render(request, template_name, {
                        'form': form,
                        'error_message': 'Email already exists'
                    })
                elif form.cleaned_data['password'] != form.cleaned_data['password_repeat']:
                    return render(request,template_name, {
                        'form': form,
                        'error_message': 'Passwords do not match'
                    })
                else:
                    # Create the user
                    user = User.objects.create_user(
                        form.cleaned_data['username'],
                        form.cleaned_data['student_email'],
                        form.cleaned_data['password']
                    )
                    user.first_name = form.cleaned_data['first_name']
                    user.last_name = form.cleaned_data['first_name']
                    user.dentist_or_student = form.cleaned_data['student']
                    user.date_of_birth = form.cleaned_data['date_of_birth']
                    user.country = form.cleaned_data['country']
                    user.gender = form.cleaned_data['gender']
                    user.save()

                    # Login the user
                    login(request, user)

                    # redirect to Homepage
                    return HttpResponseRedirect('home')

            else:
                messages.error(request, 'Please pick if either you are a Dentist or a Student before continuing the form')
                return redirect('register')

    # No post data available, just show the webpage
    else:
        form = RegistrationForm()

    return render(request, template_name, {'form': form})

enter image description here

【问题讨论】:

    标签: django


    【解决方案1】:

    您应该将两者都添加到您的 html 中,并将它们隐藏起来。 然后在您的 Select 中添加一个警报,并且 OnChange 您可以将所选表单设置为 hidden=false。

    YOURSELECT.addEventListener("change", document.getElementById(YOURSELECT.value).removeAttribute("hidden"););

    【讨论】:

      【解决方案2】:

      您正在将CharField (see docs) 用于具有选项的字段。尝试改用ChoiceField (see docs)。 比如:

      specialty = forms.ChoiceField(choices= Specialties, required=True)
      

      【讨论】:

      • 谢谢@everspader,我会解决的。但我的问题实际上与此无关。我想知道如何在一个网页中同时拥有两种表格,我可以选择学生和牙医,牙医和学生都有自己的表格。我发现的一种方法是制作两个不同的网址,一个用于牙医登记表,另一个用于学生表格。尽管我确实找到了解决方法,但我想知道我的想法是否有解决方案。如果我的想法不清楚,请告诉我
      • 嗨@Leo,很抱歉误解了您的问题。 Paolo 上面所说的几乎就是你如何做到的。使用模板中的 JavaScript 处理隐藏/我隐藏的字段或试试这个:stackoverflow.com/questions/6717249/…
      猜你喜欢
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2017-11-05
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多