request.user作为Django中选择小部件的选择

时间:2014-11-03 14:32:15

标签: python django django-models django-forms django-views

我有一个模型字段

is_anonymous = BooleanField(default=False)

我也有ModelForm。我希望这个字段用select小部件表示。

这将是

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['is_anonymous']
        widgets = {
            'is_anonymous': forms.NullBooleanSelect(),
        }

有效。但我希望select窗口小部件只有两个选项true(1)和false(0),每个选项中代表的文本应为Anonymous {{1} {}}和true self.request.user

我认为我必须在视图中进行此替换,因为false中没有self.request.user

我该怎么做?

1 个答案:

答案 0 :(得分:2)

它不是100%清楚你想要什么,但如果你想显示一个只有两个选择的选择下拉列表; "匿名"映射到True和" myusername" (即当前用户的用户名)映射到False,您需要覆盖is_anonymous字段小部件的choices属性:

class MyModelForm(forms.ModelForm):
    def __init__(self, user, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)
        self.fields['is_anonymous'].widget = forms.Select(choices=[
            (True, "Anonymous"),
            (False, user.username)
        ])

    class Meta:
        model = MyModel
        fields = ['is_anonymous']

因为我们需要表单中的user对象,所以我们需要在视图中定义表单时手动将其作为参数传递。这取决于您使用的视图类型,但如果它是基于CreateView的通用类,则需要以下内容:

class MyCreateView(CreateView):
    form_class = MyModelForm
    ...

    def get_form(self, form_class):
        return self.form_class(self.request.user, **self.get_form_kwargs())

    ...