2016-12-21 9 views
0

私は過去数日間、モデルフォームとは異なるウィジェットを使用するモデルフォームを取得しようとしていました。私はSlackのチャンネルオプションのリストを動的に更新するフォームを作ろうとしていますし、動作するフォームを取得する際に問題があります。Django ModelFormウィジェットのオーバーライド問題

モデル:

class Team(models.Model): 
    team_id = models.CharField(editable=False, primary_key=True, max_length=30) 
    access_token = models.CharField(max_length=128, editable=False) 
    post_channel = models.CharField(max_length=21, default=None) 
    approval_channel = models.CharField(max_length=21, default=None) 
    last_edit = models.CharField(max_length=21, default=None) 
    admin_only_approval = models.BooleanField(default=True) 
    admin_only_edit = models.BooleanField(default=True) 

フォームの試み1:

class TeamSettingsForm(forms.ModelForm): 
    post_channel = forms.ChoiceField() 
    approval_channel = forms.ChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(TeamSettingsForm, self).__init__(*args, **kwargs) 

     slack = Slacker(kwargs['instance'].access_token) 

     priv_ch = [(g['id'], g['name']) for g in slack.groups.list().body['groups'] if not g['is_archived']] 
     pub_ch = [(c['id'], c['name']) for c in slack.channels.list().body['channels'] if not c['is_archived']] 
     users = [(u['id'], u['profile']['real_name']) for u in slack.users.list().body['members'] if not u['deleted']] 

     self.fields['post_channel'].widget.choices=tuple(pub_ch) 
     self.fields['approval_channel'].widget.choices=tuple(pub_ch + priv_ch + users) 

    class Meta: 
     model = Team 
     fields = ['post_channel', 'approval_channel', 'admin_only_approval', 
        'admin_only_edit'] 

フォームが送信されるたびに、データが無効であることを述べていると選択フィールドの入力は次のいずれかではなかったこと利用可能なオプション。

フォームの試み2:

class TeamSettingsForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(TeamSettingsForm, self).__init__(*args, **kwargs) 

     slack = Slacker(kwargs['instance'].access_token) 

     priv_ch = [(g['id'], g['name']) for g in slack.groups.list().body['groups'] if not g['is_archived']] 
     pub_ch = [(c['id'], c['name']) for c in slack.channels.list().body['channels'] if not c['is_archived']] 
     users = [(u['id'], u['profile']['real_name']) for u in slack.users.list().body['members'] if not u['deleted']] 

     self.fields['post_channel'].widget = forms.ChoiceField(choices=tuple(pub_ch)) 
     self.fields['approval_channel'].widget = forms.ChoiceField(choices=tuple(pub_ch + priv_ch + users)) 

    class Meta: 
     model = Team 
     fields = ['post_channel', 'approval_channel', 'admin_only_approval', 
        'admin_only_edit'] 

フォームの試み3:

class TeamSettingsForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(TeamSettingsForm, self).__init__(*args, **kwargs) 

     slack = Slacker(kwargs['instance'].access_token) 

     priv_ch = [(g['id'], g['name']) for g in slack.groups.list().body['groups'] if not g['is_archived']] 
     pub_ch = [(c['id'], c['name']) for c in slack.channels.list().body['channels'] if not c['is_archived']] 
     users = [(u['id'], u['profile']['real_name']) for u in slack.users.list().body['members'] if not u['deleted']] 

     self.fields['post_channel'].widget.choices=tuple(pub_ch) 
     self.fields['approval_channel'].widget.choices=tuple(pub_ch + priv_ch + users) 

    class Meta: 
     model = Team 
     fields = ['post_channel', 'approval_channel', 'admin_only_approval', 
        'admin_only_edit'] 
     widgets = { 
      'post_channel': forms.ChoiceField, 
      'approval_channel': forms.ChoiceField 
     } 

ページをレンダリングするための試み2と3はさえ許しませんでした。

私は異なるオプションin the Django documentationを試してきましたが、それほど有用ではありませんでした。

+0

ビットのために働くことになったものですが、 'self.fields [ 'post_channel'] = forms.CharField(ウィジェット= forms.Select(選択肢を試してみてください=タプル(pub_ch)、ラベル= 'ポストチャンネル') ' – AMG

答えて

0

これは、ここで 'もしも' のの私

self.fields['post_channel'].widget = forms.Select(choices=tuple(pub_ch)) 
関連する問題