预填充表单在django中选择具有特定值的字段并对其进行初始化

时间:2014-01-21 08:17:18

标签: django django-forms

我在django中有一个模型,它有一个django用户模型的外键

class Entry(models.Model):
    user = models.ForeignKey(User)

和相应的模型表格

class EntryForm(ModelForm)

    class Meta:
        model = Entry

用户字段使用“选择”小部件。我希望这个小部件只有员工用户。所以我尝试了以下内容。

观点:

form = EntryForm(initial={'user':User.objects.filter(is_staff=True)}

但没有奏效。 “选择”小组件显示所有用户员工和非员工

然后我尝试了这个:     form = EntryForm()     form.fields ['user']。queryset = User.objects.filter(is_staff = True)

并且工作了。 我想要做的是将选择用户的选项缩小到仅限员工用户,但我希望能够预先选择某个值,例如用户登录(员工用户).e.g

form = EntryForm(initial={'user':request.user}) #pre-select specific user
form.fields['user'].queryset = User.objects.filter(is_staff = True) #only show staff users

但这不起作用。我在这里说,我想初始化其他表单字段,例如日期和其他表单字段,但为了简单起见,我将它们排除在外。

我也尝试使用表单的 init 方法,但不能很好地使用上面的代码

def __init__(self, *args, **kwargs):
    pass

给我一​​个错误(用于测试目的的通过)。

AttributeError
    'EntryAddForm' object has no attribute 'fields'

那么有没有办法在表单中初始化一个Select字段,同时在该字段中同时排除或包含某个查询集?

2 个答案:

答案 0 :(得分:1)

我想我解决了..我做的是

form = EntryForm()
form.fields['user'].queryset = User.objects.filter(is_staff=True)
form.fields['user'].initial = request.user

并且工作了。我应该将所有形式逻辑放在 init 中吗?

答案 1 :(得分:1)

在黑暗中拍摄一下,但是EntryForm.Meta类似乎需要fields属性,如Django docs中所述。

class EntryForm(ModelForm)

    class Meta:
        model = Entry
        fields = ["user"]