Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何在验证前覆盖字段值?_Django_Django Forms - Fatal编程技术网

Django 如何在验证前覆盖字段值?

Django 如何在验证前覆盖字段值?,django,django-forms,Django,Django Forms,我有一个表单,在验证之前需要为它设置一些值。我正在努力: if request.method == 'POST': reservation_form = ReservationForm(request.POST, initial={'is_reservation':True, 'user':request.user}) 但它不起作用。如果我从(模型)表单中排除“user”字段,我会得到一个空约束错误,如果我包含它,我会得到一个验证错误。因此,要么它忽略初始值,因为我已排除该字段,要么r

我有一个表单,在验证之前需要为它设置一些值。我正在努力:

if request.method == 'POST':
    reservation_form = ReservationForm(request.POST, initial={'is_reservation':True, 'user':request.user})
但它不起作用。如果我从(模型)表单中排除“user”字段,我会得到一个空约束错误,如果我包含它,我会得到一个验证错误。因此,要么它忽略初始值,因为我已排除该字段,要么request.POST数据胜过它,即使该值未发布

那我该怎么做呢



好的,我希望我现在已经正确地理解了这个问题:

您有一个
ReservationForm
,它没有
用户
,也没有
是\u reservation
字段。因此,设置
initial={'user':…}
没有任何意义,因为
user
不是该表单的一部分(而且
也不是保留的一部分)

另一方面,您有一个
保留
模型,该模型由表单的一些值和一个附加的用户id填充,还有一个
is_保留
布尔值

所以,通常你会这样写:

form = ReservationForm() # you migth want to set inital values here
if request.method == 'POST':
    form = ReservationForm(request.POST)
    if form.is_valid():
        data = form.cleaned_data
        reservation = Reservation() # create a new model

        # copy the values from the form to your new model
        reservation.payment_method = data['payment_methods']
        reservation.payment_time = data['payment_time']

        # set some additional values for the model (which are required)
        reservation.user_id = request.session['user_id'] # for example
        reservation.is_reservation = True

        # save the reservation (all required fields, including the user_id are now set)
        reservation.save()
请注意,这只是一个例子。我还没有看过你的模型课,所以你的模型看起来可能有点不同。但我认为你能适应它

更新

我认为以下方法可能有效(但您必须排除
用户
是您已经提到的预订


好的,我希望我现在已经正确地理解了这个问题:

您有一个
ReservationForm
,它没有
用户
,也没有
是\u reservation
字段。因此,设置
initial={'user':…}
没有任何意义,因为
user
不是该表单的一部分(而且
也不是保留的一部分)

另一方面,您有一个
保留
模型,该模型由表单的一些值和一个附加的用户id填充,还有一个
is_保留
布尔值

所以,通常你会这样写:

form = ReservationForm() # you migth want to set inital values here
if request.method == 'POST':
    form = ReservationForm(request.POST)
    if form.is_valid():
        data = form.cleaned_data
        reservation = Reservation() # create a new model

        # copy the values from the form to your new model
        reservation.payment_method = data['payment_methods']
        reservation.payment_time = data['payment_time']

        # set some additional values for the model (which are required)
        reservation.user_id = request.session['user_id'] # for example
        reservation.is_reservation = True

        # save the reservation (all required fields, including the user_id are now set)
        reservation.save()
请注意,这只是一个例子。我还没有看过你的模型课,所以你的模型看起来可能有点不同。但我认为你能适应它

更新

我认为以下方法可能有效(但您必须排除
用户
是您已经提到的预订


您还可以添加
ReservationForm
类的定义吗?@tux:不确定这有什么帮助,但可以。您还可以添加
ReservationForm
类的定义吗?@tux:不确定这有什么帮助,但可以。不。。。对不起,你弄错了。ReservationForm确实从模型继承了
is_reservation
user
字段,我只是不想渲染它们
is\u reservation
应始终为True(在共享同一型号的另一种形式中为false),并且
user
始终为
request.user
。设置
initial=
是有意义的,它就是不起作用。你给了我一个主意。。。我只是
排除这两个字段,然后
是有效的()
就不会被它们绊倒,然后我可以在
表单中正确设置它们。是有效的
block.PS:一种更简单的方法是
保留=保留表单(commit=False)
。那么你就不需要复制任何值了……嗯,我想你是对的,表单中没有这些字段。。。但只有当我将它们放入
排除
列表时。。我不在乎它们是否在那个列表中,我只是想让这该死的事情起作用:p排除它们,然后将它们设置在
中是有效的
应该会起作用。啊,好的。我还没有看过
。。。添加一个
exclude
将有效。但是您需要在其他地方提供值(initial无法工作,因为如果不渲染字段,则在渲染期间字段不能具有初始值)。另外,我通常使用WTForms和SQLAlchemy,并编写
myform.populate\u model(mymodel)
there:DYes。。。这正是我遇到的问题。我来看看WT表格。。。反正我有点讨厌Django表格不。。。对不起,你弄错了。ReservationForm确实从模型继承了
is_reservation
user
字段,我只是不想渲染它们
is\u reservation
应始终为True(在共享同一型号的另一种形式中为false),并且
user
始终为
request.user
。设置
initial=
是有意义的,它就是不起作用。你给了我一个主意。。。我只是
排除这两个字段,然后
是有效的()
就不会被它们绊倒,然后我可以在
表单中正确设置它们。是有效的
block.PS:一种更简单的方法是
保留=保留表单(commit=False)
。那么你就不需要复制任何值了……嗯,我想你是对的,表单中没有这些字段。。。但只有当我将它们放入
排除
列表时。。我不在乎它们是否在那个列表中,我只是想让这该死的事情起作用:p排除它们,然后将它们设置在
中是有效的
应该会起作用。啊,好的。我还没有看过
。。。添加一个
exclude
将有效。但是您需要在其他地方提供值(initial无法工作,因为如果不渲染字段,则在渲染期间字段不能具有初始值)。另外,我通常使用WTForms和SQLAlchemy,并编写
myform.populate\u model(mymodel)
there:DYes。。。这正是我遇到的问题。我来看看WT表格。。。反正我有点讨厌Django表格。
form = ReservationForm(request.POST)
reservation = form.save(commit=False)
reservation.user = request.user
reservation.is_reservation = True
reservation.save()