python 提交表单时向todos_id传递空值,即使我已更改它

x6yk4ghg  于 2023-02-15  发布在  Python
关注(0)|答案(2)|浏览(75)

这是我的视图是createview和我已经使用自定义表单和发送当前用户id到表单

class createToDo(CreateView):
        success_url = 'home'
        form_class = ToDoForm
        template_name = 'home.html'
        user_id = None
        test = 'vaseem'

      def get_form_kwargs(self):
          kwargs = super().get_form_kwargs()
          kwargs['user_id'] = self.user_id
          return kwargs

      def get(self, request: HttpRequest, *args: str, **kwargs) -> HttpResponse:
          self.user_id = request.user.id
          return super().get(request, *args, **kwargs)

这是我的表格

class ToDoForm(ModelForm):
     todos_id = forms.CharField(widget=forms.TextInput(attrs={'value':'test'}))
     title = forms.CharField(widget=forms.TextInput(attrs={'id':'title'}))
     description = forms.CharField(widget=forms.Textarea(attrs= 
     {'id':'description','cols':30,'rows':2}))

     date = forms.DateField(widget=forms.DateInput(attrs={'type':'date'}))

 class Meta():
     model = ToDo
     fields = ('title','description','date','todos_id')

     def __init__(self,user_id = None,*args, **kwargs):
          self.id_data = user_id
          super(ToDoForm,self).__init__(*args,**kwargs)
          self.fields['todos_id']= forms.CharField(widget=forms.TextInput(attrs= 
          {'value':self.id_data,'style':'display:none;'}))

这是后期数据,从这个数据来看,很明显值不是没有,那么是什么问题

Variable     Value 
csrfmiddlewaretoken 'QCBi8WL9GYK0LdRx1FQq7sXDNjSaKjjv8IWnLwQ63toz43uNhGtM1H8C50c54zUC'
todos_id    'None'
title   'test'
description 'testdesc'
date    '2023-02-23'

这是我的模型,它连接到我的用户模型

class ToDo(models.Model):
    todos = models.ForeignKey(User,on_delete=models.CASCADE)
    title = models.CharField(max_length=75,null=False)
    description = models.TextField(null=False)
    date = models.DateField(null=False)
    done = models.BooleanField(default=False)

这是错误显示,即使我可以看到值在这todos_id输入当检查

IntegrityError at /createToDo
      null value in column "todos_id" of relation "ToDoApp_todo" violates not-null 
constraint
    DETAIL:  Failing row contains (21, test, testdesc, 2023-02-23, f, null).
zsbz8rwp

zsbz8rwp1#

todos_id的值可能在传递给表单之前没有在Python代码中正确更新。在将todos_id发送给表单之前,请仔细检查Python代码中是否为它指定了正确的值。
todos_id的值也可能在代码的其他地方被覆盖或修改,因此您可能需要检查todos_id的值被修改的任何其他地方。
如果您已经验证了Python代码是正确的,但问题仍然存在,您可能需要检查表单本身是否存在任何问题,例如todos_id的输入字段是否设置正确以接收正确的值。

igetnqfo

igetnqfo2#

您不需要在get方法中设置user_id值,您可以在get_form_kwargs方法中访问它,如下所示:

def get_form_kwargs(self):
      kwargs = super().get_form_kwargs()
      kwargs['user_id'] = self.request.user.id
      return kwargs

除此之外,你的表单覆盖也不应该起作用,因为参数和关键字参数的顺序不正确。参数会先出现,然后是关键字参数。因此它应该看起来像这样:

def __init__(self,*args, user_id = None, **kwargs):
      self.id_data = user_id
      super(ToDoForm,self).__init__(*args,**kwargs)

相关问题