我试图将用户对象从views.py传递到forms.py中,并传递给用户字段并保存一个新对象。用户字段是模型中的外键。我可以像选择jobSite字段一样执行选择下拉小部件,但是我试图在提交时自动传递用户对象,而不是当前用户必须从下拉列表中选择另一个用户。我已经尝试过像这样
将用户作为来自views.py的初始键值传递form = entryTime(request.POST, initial={'user': user})
我已经尝试了几种不同的变体,但是到目前为止还不能成功地将用户对象保存到用户字段中。
forms.py
class entryTime(ModelForm):
class Meta:
model = Entry
fields = [
'user',
'start_time',
'end_time',
'jobSite',
]
widgets = {
'start_time': DateTimePicker(
options={'useCurrent': True, 'collapse': False},
attrs={'append': 'fa fa-calendar', 'icon_toggle': True}
),
'end_time': DateTimePicker(
options={'useCurrent': True, 'collapse': False},
attrs={'append': 'fa fa-calendar', 'icon_toggle': True}
),
'jobSite': Select()
}
def __init__(self, *args, **kwargs):
super(entryTime, self).__init__(*args, **kwargs)
self.fields['start_time'].widget.attrs['class'] = 'form-control'
self.fields['end_time'].widget.attrs['class'] = 'form-control'
self.fields['jobSite'].widget.attrs['class'] = 'form-control'
views.py
def addTimeEntry(request, userId):
user = User.objects.get(pk=userId)
form = entryTime()
if request.POST:
form = entryTime(request.POST)
if form.is_valid():
print('form is valid')
args={"form":form}
return render(request, 'timesheets/addTimeEntry.html', args)
非常感谢您的帮助
答案 0 :(得分:0)
您没有将其作为初始数据传递。您只需在视图中设置表单user
的{{1}}属性即可。因此,您可以在instance
中省略user
字段。我建议您添加一个EntryTimeForm
后缀,因为否则它很容易引入“名称冲突”:
Form
,然后在您的视图中设置class entryTimeForm(ModelForm):
class Meta:
model = Entry
_dt_options = {'useCurrent': True, 'collapse': False}
_dt_attrs = {'append': 'fa fa-calendar', 'icon_toggle': True, 'class': 'form-control'}
fields = [ 'start_time', 'end_time', 'jobSite']
widgets = {
'start_time': DateTimePicker(options=_dt_options, attrs=_dt_attrs),
'end_time': DateTimePicker(options=_dt_options, attrs=_dt_attrs),
'jobSite': Select(attrs={'class': 'form-control'})
}
属性:
user
您甚至可以省略获取def addTimeEntry(request, userId):
user = User.objects.get(pk=userId)
if request.POST:
form = EntryTimeForm(request.POST)
if form.is_valid():
form.instance.user = user
form.save()
return redirect('some_view')
else:
form = EntryTimeForm()
args={'form': form}
return render(request, 'timesheets/addTimeEntry.html', args)
对象的操作,从而减少查询次数:
user