如何将用户对象传递到表单字段

时间:2019-07-12 19:25:46

标签: django django-forms

我试图将用户对象从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)

非常感谢您的帮助

1 个答案:

答案 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