Python Django:避免数据类型限制

Python Django:避免数据类型限制,python,django,forms,validation,Python,Django,Forms,Validation,我有一个类,它有一个IntegerFieldattr。 在它的ModelForm中,在这个attr的字段中,我需要发送一个字符串,该字符串在视图中处理后将存储一个整数。 问题是Django不允许这样做,当我使用form.cleaned\u data.get('myattr')时,它说这是错误的,因为它应该是一个整数 class Student(models.Model): teacher = models.IntegerField(null=False) # I'm saving tea

我有一个类,它有一个
IntegerField
attr。 在它的
ModelForm
中,在这个attr的字段中,我需要发送一个字符串,该字符串在视图中处理后将存储一个整数。 问题是Django不允许这样做,当我使用
form.cleaned\u data.get('myattr')
时,它说这是错误的,因为它应该是一个整数

class Student(models.Model):
    teacher = models.IntegerField(null=False) # I'm saving teacher's key here


class Teacher(models.Model:
    name = models.CharField(max_length= 50, null=False)
    key = models.IntegerField(null=False)


class StudentForm(forms.ModelForm):
    teacher = forms.ModelChoiceField(queryset=Teacher.objects.all(), label='Select the teacher')
因此,当用户选择学生的教师时,该选择字段将显示可用教师的名称。但在模型中,它将存储我在视图中管理的密钥

views.py:

teacher = form.cleaned_data.get('teacher') # it has the name
teacher = Teacher.objects.get(name=teacher).key # getting the key in order to store an Integer, but Django is banning my code before anyway.
如何在不更改模型数据类型的情况下处理此问题


我甚至将
添加到表单字段中的\u field\u name
,其中包含教师键的值。

这里一个更好的方法是在学生和教师之间建立关系(使用foregin键)

根据您的应用程序的需要,以下是如何操作:

如果一个学生可以有几个老师,一个老师可以有几个学生:

如果一名学生只能有一名教师,但一名教师可以有多名学生:

如果一名学生只能有一名教师,且一名教师只能有一名学生:

这是最好的管理方法。 然后,只需在学生窗体中映射学生模型,如下所示:

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        #you can add the list of all the fields you want there
        fields = ['teacher']
另外一个步骤是定义模型的str方法,这样Django将在表单中关联模型的字符串表示形式(这里提供了在学生表单中显示教师的好方法)


一个更好的方法是在学生和老师之间建立关系(使用foregin键)

根据您的应用程序的需要,以下是如何操作:

如果一个学生可以有几个老师,一个老师可以有几个学生:

如果一名学生只能有一名教师,但一名教师可以有多名学生:

如果一名学生只能有一名教师,且一名教师只能有一名学生:

这是最好的管理方法。 然后,只需在学生窗体中映射学生模型,如下所示:

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        #you can add the list of all the fields you want there
        fields = ['teacher']
另外一个步骤是定义模型的str方法,这样Django将在表单中关联模型的字符串表示形式(这里提供了在学生表单中显示教师的好方法)


modelcooicefield
用于选择由模型中的
ForeignKey
引用的对象。因此它需要
Teacher
实例的
pk
(主键)作为输入。为什么不在
教师
字段中使用
外键
?你现在的做法让代码变得太复杂了。因为我正在将桌面应用程序迁移到web应用程序,并且我必须保留表的结构。Job Stuff然后确保您的HTML表单将
pk
作为值发布(字段具有可见值,您可以使用名称,实际发布值,您应该使用
pk
)。如果你在模板中使用
{{form.teacher}}
,这应该就行了。如果我检查元素,在标记中,它在值attr中显示pk,并显示名称。因为我习惯于用pk来定义字段名。我无法理解为什么视图从post方法接收字符串。您得到的错误到底是什么?向我们展示您的模板、错误回溯以及
请求的内容。POST
。请注意,所有内容都始终以字符串形式发布,甚至是整数。当表单字段获取值(并清除值)时,它们被转换回所需的任何内容。
modelcoocefield
用于选择模型中由
ForeignKey
引用的对象。因此它需要
Teacher
实例的
pk
(主键)作为输入。为什么不在
教师
字段中使用
外键
?你现在的做法让代码变得太复杂了。因为我正在将桌面应用程序迁移到web应用程序,并且我必须保留表的结构。Job Stuff然后确保您的HTML表单将
pk
作为值发布(字段具有可见值,您可以使用名称,实际发布值,您应该使用
pk
)。如果你在模板中使用
{{form.teacher}}
,这应该就行了。如果我检查元素,在标记中,它在值attr中显示pk,并显示名称。因为我习惯于用pk来定义字段名。我无法理解为什么视图从post方法接收字符串。您得到的错误到底是什么?向我们展示您的模板、错误回溯以及
请求的内容。POST
。请注意,所有内容都始终以字符串形式发布,甚至是整数。当表单字段获取值(并清除它)时,它们会返回到所需的任何内容。我非常感谢您的回答。这很有用,但在这种情况下不行,因为我正在将桌面应用程序迁移到web应用程序,而该公司希望保留其表的结构。这就是为什么我试图用其他方式来处理这个问题。如果我可以让代码忽略数据类型…如果你在学生表单中添加学生的元描述会怎么样。然后使用Select作为表单小部件,并在init中填充数据库查询中的Select?我非常感谢您的回答。这很有用,但在这种情况下不行,因为我正在将桌面应用程序迁移到web应用程序,而该公司希望保留其表的结构。这就是为什么我试图用其他方式来处理这个问题。如果我可以让代码忽略数据类型…如果你在学生表单中添加学生的元描述会怎么样。然后使用Select作为表单小部件,并在init内部填充数据库查询中的Select?