2014-11-03 63 views
0

选择我有一个模型字段request.user在选择窗口小部件在Django

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),并在每个选项所代表的文字应该是Anonymoustrueself.request.userfalse

我认为我必须在视图中进行此替换,因为self.request.userModelForm中不可用。

我该怎么做?

回答

2

这不是100%清楚你想要什么,但如果你想显示一个选择下拉列表只有两个选择; “无名氏”,它映射到真和“名为myUsername”(即当前用户的用户名)映射到假,你需要重写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()) 

    ... 
+0

我很抱歉,如果它是不明确的,但你明白究竟是什么意思。谢谢 :-) – Jamgreen 2014-11-03 15:17:26

相关问题