2017-08-15 24 views
0

我在做一個管理形式一個selectMultiple與動態填充選擇在Django 1.10的Django的selectMultiple未能顯示保存的選擇

這是模型:

class HelpRequest(models.Model): 
    name = models.CharField(max_length=32) 
    groups = models.TextField(blank=True) 

這是我的形式:

class AdminHelpRequestForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['groups'] = forms.MultipleChoiceField(choices=groups_from_ldap, 
                widget=SelectMultiple(attrs={'class': 'chosen'})) 

    class Meta: 
     model = HelpRequest 
     fields = ('name', 'groups') 

的形式獲取管理員使用:

@admin.register(HelpRequest) 
class HelpRequestAdmin(admin.ModelAdmin): 
    form = AdminHelpRequestForm 

的的selectMultiple節省精的選擇到模型

>>> ar = HelpRequest.objects.get(pk=1) 
>>> print(ar.groups) 
['mygroup', 'othergroup', 'yetanothergroup'] 

但在小部件將不顯示從模型實例保存的選擇。

這裏有什麼問題?

回答

0

不知何故與直覺相反的解決辦法是添加自定義的清潔創建一個逗號分隔的選擇的字符串,然後分割該字符串轉換成一個列表,並手動將它設置爲初始:

class AdminHelpRequestForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['groups'] = forms.MultipleChoiceField(choices=groups_from_ldap, 
               widget=SelectMultiple(attrs={'class': 'chosen'})) 

    if self.instance: 
     self.initial['groups'] = self.instance.groups.split(',') 

class Meta: 
    model = HelpRequest 
    fields = ('name', 'groups') 

def clean_groups(self): 
    groups = self.cleaned_data['groups'] 
    if groups: 
     assert isinstance(groups, (list, tuple)) 
     return str(','.join(groups)) 
    else: 
    return '' 

這有在管理列表視圖中使組更加簡潔和易讀的好處。

另一個更簡潔的可能性是沒有這方面的清潔功能可言的,只是ast.literal_eval去:

import ast 

class AdminHelpRequestForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.fields['groups'] = forms.MultipleChoiceField(choices=groups_from_ldap, 
               widget=SelectMultiple(attrs={'class': 'chosen'})) 

    if self.instance.groups: 
     self.initial['groups'] = ast.literal.eval(self.instance.groups) 

class Meta: 
    model = HelpRequest 
    fields = ('name', 'groups')