У меня возникли проблемы в течение последних нескольких дней с попыткой получить модельную форму для использования другого виджета, чем то, что находится в модели. Я пытаюсь сделать форму, которая динамически обновляет список параметров канала от 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, но это еще не все, что полезно.
немного 'что если' здесь, но попробовать 'self.fields [ 'post_channel'] = forms.CharField (виджет = forms.Select (выбор = tuple (pub_ch), label = 'Post Channel') ' – AMG