【问题标题】:How to make Required: boolean field in model Django如何使必需:模型 Django 中的布尔字段
【发布时间】:2018-04-03 04:24:54
【问题描述】:

我有一个模型,其字段名为 is_studentis_teacher StudentTeacher 表单

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

我想确保这个字段是:

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

当前:is_teacherTeacherApplications 模型中

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

  • 选中给我这个错误:

ValueError 在 /register/teacher 处 int() 的无效文字与 base 10: ''

当前:is_studentStudentProfile 模型中

  • 选中出现此错误

ValidationError at /register/ ["'on' 值必须为 True 或 错误。”]

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

更新代码


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

IntegrityError at /register/ NOT NULL 约束失败: account_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')

【问题讨论】:

  • 也发布您的表格
  • @Exprator 完成!想法? :)

标签: python django model modelform


【解决方案1】:

您可以将此字段添加到 StudentResistrationFormTeacherRegistrationForm 并在 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  

除了从request.POST 获取原始数据之外,您还可以使用表单创建studentteacher 对象:

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

【讨论】:

  • 几乎可以工作,我更新了代码以在其中显示您的解决方案...检查时出现新错误错误:IntegrityError at /register/ NOT NULL 约束失败:accounts_studentprofile.is_student
  • 有什么想法吗??
  • @Shaz 你在表格中添加了 clean_is_student 吗?
  • 完美!谢谢大家理解,请问这个错误到底是什么意思?
  • @Shaz 因为clean_is_student 没有返回任何值,已将空值提供给数据库。但是 is_student 不是可为空的字段,这种情况引发了错误。修复后,您将 is_student 的实际值传递给 DB,并且只有 Is_student 的错误是错误的。
猜你喜欢
  • 1970-01-01
  • 2010-12-19
  • 2020-10-10
  • 1970-01-01
  • 2019-09-03
  • 2018-11-20
  • 2019-02-04
  • 1970-01-01
  • 2018-11-23
相关资源
最近更新 更多