将 Django 表单输入保存到模型时出现实例错误
instance error while saving Django form input to model
尝试将输入保存到模型时显示此错误无法分配“3380786777”:“Registration.nid”必须是“Nid”实例。
我在这个项目中使用 MySQL 数据库。尝试了几个小时来解决这个问题。已在 Nid table 中插入值,而我尝试在注册 table 中插入的 Nid 确实存在于 Nid table.
中
这是我的模型:
class Nid(models.Model):
id = models.BigIntegerField(primary_key=True)
fname = models.CharField(db_column='FName', max_length=100, blank=True, null=True) # Field name made lowercase.
lname = models.CharField(db_column='LName', max_length=100, blank=True, null=True) # Field name made lowercase.
dob = models.DateField()
fathers_name = models.CharField(db_column='Fathers_Name', max_length=150, blank=True, null=True) # Field name made lowercase.
mothers_name = models.CharField(db_column='Mothers_Name', max_length=150, blank=True, null=True) # Field name made lowercase.
address = models.ForeignKey(Address, models.DO_NOTHING, db_column='Address_ID', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'nid'
class Registration(models.Model):
nid = models.OneToOneField(Nid, models.DO_NOTHING, db_column='NID', primary_key=True) #
Field name made lowercase.
date = models.DateTimeField(db_column='Date') # Field name made lowercase.
center = models.ForeignKey(Center, models.DO_NOTHING, db_column='Center_ID', blank=True,
null=True) # Field name made lowercase.
mobile_no = models.IntegerField(db_column='Mobile_No', blank=True, null=True) # Field
name made lowercase.
age = models.IntegerField(db_column='Age') # Field name made lowercase.
class Meta:
managed = False
db_table = 'registration'
unique_together = (('mobile_no', 'center'),)
Form:
class PostForm(forms.Form):
NID = forms.IntegerField()
Date_of_Birth =forms.DateField(widget=forms.SelectDateWidget(years=range(1921,2004)))
Phone_number = forms.IntegerField()
Center = forms.ChoiceField(choices=choice)
CAPTCHA = forms.CharField()
查看:
class RegistrationView(FormView):
template_name = "registration.html"
form_class = PostForm
success_url='/otp'
def form_valid(self, form):
search_term=form.cleaned_data['NID']
search_term2=form.cleaned_data['Date_of_Birth']
search_term3=form.cleaned_data['Phone_number']
search_term4=form.cleaned_data['Center']
valid = Nid.objects.filter(id=search_term)
new_object = Registration.objects.create(
nid = form.cleaned_data['NID'],
center = form.cleaned_data['Center'],
mobile_no = form.cleaned_data['Phone_number'],
age = 19
)
for objects in valid:
if valid and objects.dob == search_term2:
return super().form_valid(form)
else:
form.add_error('NID', 'You are not eligible')
return self.form_invalid(form)
忽略年龄值。
由于 nid 注册模型字段是 OneToOneField 那么您应该在表单中使用 ModelChoiceField。
class PostForm(forms.Form):
NID = forms.ModelChoiceField(queryset=Nid.objects.all())
# other fields
否则,在创建注册对象
之前,首先从 NID 值中获取 Nid 模型 的对象
try:
nid_obj = Nid.objects.get(id=form.cleaned_data['NID'])
except:
# raise exception
new_object = Registration.objects.create(
nid=nid_obj,
center=form.cleaned_data['Center'],
mobile_no=form.cleaned_data['Phone_number'],
age = 19
)
尝试将输入保存到模型时显示此错误无法分配“3380786777”:“Registration.nid”必须是“Nid”实例。 我在这个项目中使用 MySQL 数据库。尝试了几个小时来解决这个问题。已在 Nid table 中插入值,而我尝试在注册 table 中插入的 Nid 确实存在于 Nid table.
中这是我的模型:
class Nid(models.Model):
id = models.BigIntegerField(primary_key=True)
fname = models.CharField(db_column='FName', max_length=100, blank=True, null=True) # Field name made lowercase.
lname = models.CharField(db_column='LName', max_length=100, blank=True, null=True) # Field name made lowercase.
dob = models.DateField()
fathers_name = models.CharField(db_column='Fathers_Name', max_length=150, blank=True, null=True) # Field name made lowercase.
mothers_name = models.CharField(db_column='Mothers_Name', max_length=150, blank=True, null=True) # Field name made lowercase.
address = models.ForeignKey(Address, models.DO_NOTHING, db_column='Address_ID', blank=True, null=True) # Field name made lowercase.
class Meta:
managed = False
db_table = 'nid'
class Registration(models.Model):
nid = models.OneToOneField(Nid, models.DO_NOTHING, db_column='NID', primary_key=True) #
Field name made lowercase.
date = models.DateTimeField(db_column='Date') # Field name made lowercase.
center = models.ForeignKey(Center, models.DO_NOTHING, db_column='Center_ID', blank=True,
null=True) # Field name made lowercase.
mobile_no = models.IntegerField(db_column='Mobile_No', blank=True, null=True) # Field
name made lowercase.
age = models.IntegerField(db_column='Age') # Field name made lowercase.
class Meta:
managed = False
db_table = 'registration'
unique_together = (('mobile_no', 'center'),)
Form:
class PostForm(forms.Form):
NID = forms.IntegerField()
Date_of_Birth =forms.DateField(widget=forms.SelectDateWidget(years=range(1921,2004)))
Phone_number = forms.IntegerField()
Center = forms.ChoiceField(choices=choice)
CAPTCHA = forms.CharField()
查看:
class RegistrationView(FormView):
template_name = "registration.html"
form_class = PostForm
success_url='/otp'
def form_valid(self, form):
search_term=form.cleaned_data['NID']
search_term2=form.cleaned_data['Date_of_Birth']
search_term3=form.cleaned_data['Phone_number']
search_term4=form.cleaned_data['Center']
valid = Nid.objects.filter(id=search_term)
new_object = Registration.objects.create(
nid = form.cleaned_data['NID'],
center = form.cleaned_data['Center'],
mobile_no = form.cleaned_data['Phone_number'],
age = 19
)
for objects in valid:
if valid and objects.dob == search_term2:
return super().form_valid(form)
else:
form.add_error('NID', 'You are not eligible')
return self.form_invalid(form)
忽略年龄值。
由于 nid 注册模型字段是 OneToOneField 那么您应该在表单中使用 ModelChoiceField。
class PostForm(forms.Form):
NID = forms.ModelChoiceField(queryset=Nid.objects.all())
# other fields
否则,在创建注册对象
之前,首先从 NID 值中获取 Nid 模型 的对象try:
nid_obj = Nid.objects.get(id=form.cleaned_data['NID'])
except:
# raise exception
new_object = Registration.objects.create(
nid=nid_obj,
center=form.cleaned_data['Center'],
mobile_no=form.cleaned_data['Phone_number'],
age = 19
)