我有一个模型字段
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
。
我该怎么做?
答案 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())
...