Skip to main content
 首页 » 编程设计

python之如何制作 Required : boolean field in model Django

2024年09月07日32findumars

我有一个模型,其字段以 is_student 和 is_teacher Student 和 Teacher 形式调用

is_teacher = models.BooleanField('teacher status', default=False) 
is_student = models.BooleanField('student status', default=False) 

我想确保这个字段是:

  • 始终由用户检查 True *必需

当前:TeacherApplications 模型中的 is_teacher

  • 当未选中时 - 它会将 0 保存到表单并继续。 (不好)

  • 当检查时给我这个错误:

ValueError at /register/teacher invalid literal for int() with base 10: ''

目前:is_student 在 StudentProfile 模型

  • 当检查时给出这个错误

ValidationError at /register/ ["'on' value must be either True or False."]

  • 当取消选中时,它会将 0 保存到表单并继续。 (再次,不好)

更新代码


以上错误消失了:每次我在检查 is_teacher/is_student 后尝试提交表单时都会出现新错误

IntegrityError at /register/ NOT NULL constraint failed: accounts_studentprofile.is_student


模型

class StudentProfile(models.Model): 
    user = models.OneToOneField('Accounts', related_name='student_profile') 
    # additional fields for students 
    AMEB_Ratings = models.PositiveIntegerField(default=0) 
    is_student = models.BooleanField('student status', default=False) 
 
 
 
class TeacherApplications(models.Model): 
    user = models.OneToOneField('Accounts', related_name='teacher_profile') 
    # additional fields for teachers 
    instrument = models.TextField(max_length=500, blank=True) 
    skill = models.CharField(max_length=30, blank=True) 
    experience_in_years = models.PositiveIntegerField(blank=True) 
    is_teacher = models.BooleanField('teacher status', default=False) 

查看

def registerStudent(request): 
    # Once register page loads, either it will send to the server POST data (if the form is submitted), else if it don't send post data create a user form to register 
    if request.method == "POST": 
        user_form = UserForm(request.POST) 
        form = StudentResistrationForm(request.POST) 
 
        if form.is_valid() and user_form.is_valid(): 
            User = get_user_model() 
            username = user_form.cleaned_data['username'] 
            email = user_form.cleaned_data['email'] 
            password = user_form.cleaned_data['password'] 
            new_user = User.objects.create_user(username=username, email=email, password=password) 
 
            student = form.save(commit=False) 
            student.user = new_user 
            student.save() 
 
            # Student_profile = StudentProfile() 
            # Student_profile.user = new_user 
            # Student_profile.AMEB_Ratings = request.POST['AMEB_Ratings'] 
            # Student_profile.is_student = request.POST.get('is_student', False) 
 
            new_user.save() 
            # Student_profile.save() 
            # form.save() 
 
            return redirect('/') 
    else: 
        #  Create the django default user form and send it as a dictionary in args to the reg_form.html page. 
        user_form = UserForm() 
        form = StudentResistrationForm()         
 
        # args = {'form_student': form, 'user_form': user_form } 
    return render(request, 'accounts/reg_form_students.html', {'form_student': form, 'user_form': user_form }) 
 
def teacherApplication(request): 
    # Once register page loads, either it will send to the server POST data (if the form is submitted), else if it don't send post data create a user form to register 
    if request.method == "POST": 
        user_form = UserForm(request.POST) 
        form = TeacherRegistrationForm(request.POST) 
 
        if form.is_valid() and user_form.is_valid(): 
            User = get_user_model() 
            username = user_form.cleaned_data['username'] 
            email = user_form.cleaned_data['email'] 
            password = user_form.cleaned_data['password'] 
            new_user = User.objects.create_user(username=username, email=email, password=password) 
 
            teacher = form.save(commit=False) 
            teacher.user = new_user 
            teacher.save() 
 
            # Teacher_profile = TeacherApplications() 
            # Teacher_profile.user = new_user 
            # Teacher_profile.instrument = request.POST['instrument'] 
            # Teacher_profile.skill = request.POST['skill'] 
            # Teacher_profile.experience_in_years = request.POST['experience_in_years'] 
            # Teacher_profile.is_teacher = request.POST.get('is_teacher', False) 
 
            new_user.save() 
            # Teacher_profile.save() 
            # form.save() 
 
            return redirect('/') 
    else: 
        #  Create the django default user form and send it as a dictionary in args to the reg_form.html page. 
        user_form = UserForm() 
        form = TeacherRegistrationForm()   
    return render(request, 'accounts/reg_form_teachers.html', {'form_student': form, 'user_form': user_form }) 

表格

class StudentResistrationForm(forms.ModelForm): 
    class Meta: 
        model = StudentProfile 
        fields = (   
            'AMEB_Ratings', 
            'is_student', 
 
        ) 
 
    def save(self, commit=True): 
        user = super(StudentResistrationForm, self).save(commit=False) 
        # user.first_name = self.cleaned_data['first_name'] 
        # user.last_name = self.cleaned_data['last_name'] 
        user.AMEB_Ratings = self.cleaned_data['AMEB_Ratings'] 
 
        if commit: 
            user.save() 
 
        return user 
 
 
class TeacherRegistrationForm(forms.ModelForm): 
    class Meta: 
        model = TeacherApplications 
        fields = ( 
            'instrument', 
            'skill', 
            'experience_in_years', 
            'is_teacher', 
        ) 
 
class UserForm(forms.ModelForm): 
    class Meta: 
        model = get_user_model() 
        fields = ('username', 'email', 'password') 

请您参考如下方法:

您可以将此字段添加到 StudentResistrationForm 和 TeacherRegistrationForm 并在 clean_fieldname 方法中为其添加自定义验证以使其成为必需字段:

StudentResistrationForm(ModelForm): 
    class Meta: 
        model = StudentRegistration 
        fields = ( 
            'instrument', 
            'skill', 
            'experience_in_years', 
            'is_student', 
        ) 
 
    def clean_is_student(self): 
        is_student = self.cleaned_data.get('is_student') 
        if not is_student: 
            raise forms.ValidationError('This field is required') 
        return is_student   

此外,在 View 中,您可以使用表单创建 student 和 teacher 对象,而不是从 request.POST 获取原始数据:

new_user = User.objects.create_user(username=username, email=email, password=password) 
teacher = form.save(commit=False) 
teacher.user = new_user 
teacher.save()