将 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
             )