这是我的视图是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).
2条答案
按热度按时间zsbz8rwp1#
todos_id的值可能在传递给表单之前没有在Python代码中正确更新。在将todos_id发送给表单之前,请仔细检查Python代码中是否为它指定了正确的值。
todos_id的值也可能在代码的其他地方被覆盖或修改,因此您可能需要检查todos_id的值被修改的任何其他地方。
如果您已经验证了Python代码是正确的,但问题仍然存在,您可能需要检查表单本身是否存在任何问题,例如todos_id的输入字段是否设置正确以接收正确的值。
igetnqfo2#
您不需要在
get
方法中设置user_id
值,您可以在get_form_kwargs
方法中访问它,如下所示:除此之外,你的表单覆盖也不应该起作用,因为参数和关键字参数的顺序不正确。参数会先出现,然后是关键字参数。因此它应该看起来像这样: