Django 设置字段值';用户';在表单验证之前查看
我试图在验证之前在视图中设置字段值“user”,如下面的示例所示。但我仍然得到验证消息user is required,这表明它没有被设置。我做错了什么 谢谢 view.pyDjango 设置字段值';用户';在表单验证之前查看,django,django-forms,Django,Django Forms,我试图在验证之前在视图中设置字段值“user”,如下面的示例所示。但我仍然得到验证消息user is required,这表明它没有被设置。我做错了什么 谢谢 view.py def add_batch(request): # If we had a POST then get the request post values. if request.method == 'POST': form = BatchForm(data=request.POST, ini
def add_batch(request):
# If we had a POST then get the request post values.
if request.method == 'POST':
form = BatchForm(data=request.POST, initial={'user': request.user})
# Check we have valid data before saving trying to save.
if form.is_valid():
# Clean all data and add to var data.
data = form.cleaned_data
groups = data['groups'].split(",")
for item in groups:
batch = Batch(content=data['content'],
group=Group.objects.get(pk=item),
user=request.user
)
batch.save()
return redirect(batch.get_send_conformation_page())
else:
context = {'form': form}
return render_to_response('sms/sms_standard.html', context, context_instance=RequestContext(request))
class BatchForm(forms.ModelForm):
class Meta:
model = Batch
def __init__(self, user=None, *args, **kwargs):
super(BatchForm, self).__init__(*args,**kwargs)
if user is not None:
form_choices = Group.objects.for_user(user)
else:
form_choices = Group.objects.all()
self.fields['groups'] = forms.ModelMultipleChoiceField(
queryset=form_choices
)
form.py
def add_batch(request):
# If we had a POST then get the request post values.
if request.method == 'POST':
form = BatchForm(data=request.POST, initial={'user': request.user})
# Check we have valid data before saving trying to save.
if form.is_valid():
# Clean all data and add to var data.
data = form.cleaned_data
groups = data['groups'].split(",")
for item in groups:
batch = Batch(content=data['content'],
group=Group.objects.get(pk=item),
user=request.user
)
batch.save()
return redirect(batch.get_send_conformation_page())
else:
context = {'form': form}
return render_to_response('sms/sms_standard.html', context, context_instance=RequestContext(request))
class BatchForm(forms.ModelForm):
class Meta:
model = Batch
def __init__(self, user=None, *args, **kwargs):
super(BatchForm, self).__init__(*args,**kwargs)
if user is not None:
form_choices = Group.objects.for_user(user)
else:
form_choices = Group.objects.all()
self.fields['groups'] = forms.ModelMultipleChoiceField(
queryset=form_choices
)
如前所述,initial
值不用于设置表单中的数据,它们仅用于显示初始值
如果不希望显示用户,但希望自动设置用户,最好的做法是将用户字段从模型表单中完全排除,并在保存时在视图中进行设置。或者,由于其他原因,您将其作为参数传入,因此您可以将其添加到POST数据中:
def __init__(self, user=None, *args, **kwargs):
super(BatchForm, self).__init__(*args,**kwargs)
if user is not None:
if self.data:
self.data['user'] = user
似乎这个字段仍然是必需的“user”。我认为它应该是
form=BatchForm(user=request.user,data=request.POST)
@Bibhas我非常确定我传递用户值的答案是正确的,因为我在我的项目中也这样做了。@catherine他的\uuuuuu init\uuuuuu
函数需要一个用户
参数。@Bibhas是的,我知道我看到了。我的答案传递用户值,它不必user=request.user。我忘记了“排除”,谢谢你解释initis不是self.data
不可变的?