2016-11-22 19 views
0

私は、他のものとの関係が多岐にわたるモデルを持っています。私はhttps://gist.github.com/jdklub/9261959という例を使って、チェンジリストビューからmanytomanyフィールドを編集可能にしました。しかし、私が変更を加えるとき、manytomanyフィールドへの変更だけが実際に保存されています。djangoで変更が保存されないadmin changelistビュー

私ものModelFormとチェンジから多対多分野へのすべての参照を削除しようとしたadmin.py

class HostChangeList(ChangeList): 
    def __init__(self, request, model, list_display, list_display_links, 
     list_filter, date_hierarchy, search_fields, list_select_related, 
     list_per_page, list_max_show_all, list_editable, model_admin): 

    super(HostChangeList, self).__init__(request, model, list_display, list_display_links, 
     list_filter, date_hierarchy, search_fields, list_select_related, 
     list_per_page, list_max_show_all, list_editable, model_admin) 

    self.list_display = ('action_checkbox', 'name', 'ip', 'fagroup', 'description', 'customer_facing', 'monitored', 'puppet', 'sso') 
    self.list_editable = ['fagroup', 'description', 'customer_facing', 'monitored', 'puppet', 'sso'] 
    self.list_display_links = ['name'] 

class HostForm(forms.ModelForm): 
    fagroup = forms.ModelMultipleChoiceField(queryset=FAgroup.objects.all(),widget=forms.SelectMultiple(attrs={'size': '10'}),required=False) 
    description = forms.CharField(required=False) 
    customer_facing = forms.NullBooleanField() 
    monitored = forms.NullBooleanField() 
    puppet = forms.NullBooleanField() 
    sso = forms.NullBooleanField() 

class HostAdmin(admin.ModelAdmin): 
    def get_changelist(self, request, **kwargs): 
     return HostChangeList 

    def get_changelist_form(self, request, **kwargs): 
     return HostForm 

models.py

class Host(models.Model): 
    name = models.CharField(max_length=200) 
    ip = models.GenericIPAddressField(default='0.0.0.0') 
    fagroup = models.ManyToManyField(FAgroup) 
    description = models.TextField(default=None, blank=True, null=True) 
    customer_facing = models.NullBooleanField(default=False, null=False) 
    monitored = models.NullBooleanField(default=False, null=True) 
    puppet = models.NullBooleanField(default=False, null=True) 
    sso = models.NullBooleanField(default=False, null=True) 

    def __str__(self): 
     return self.name 

    def display_fagroups(self): 
     return ', '.join([ group.name for group in self.fagroup.all() ]) 

class FAgroup(models.Model): 
    name = models.CharField(max_length=200) 

    def __str__(self): 
     return self.name 

が、のどれもフィールドを保存します。エラーは発生せず、レコードが保存された旨のメッセージが表示されますが、変更内容は保持されません。

答えて

0

これがこの問題を解決する適切な方法であるかどうかはわかりませんが、HostAdminクラスの組み込み保存関数をオーバーライドして保存することができました。うまくいけば、これは他の人が同様の問題を見ているのに役立ちます。

class HostAdmin(admin.ModelAdmin): 
    search_fields = ('name', 'ip', 'fagroup__name') 
    list_filter = ('fagroup', 'customer_facing', 'monitored', 'puppet', 'sso') 
    actions_on_bottom = True 

    def get_changelist(self, request, **kwargs): 
     return HostChangeList 

    def get_changelist_form(self, request, **kwargs): 
     return HostForm 

    def save_model(self, request, obj, form, change): 

     if form.cleaned_data['fagroup'] != obj.fagroup: 
      obj.fagroup = form.cleaned_data['fagroup'] 
     if form.cleaned_data['description'] != obj.description: 
      obj.description = form.cleaned_data['description'] 
     if form.cleaned_data['customer_facing'] != obj.customer_facing: 
      obj.customer_facing = form.cleaned_data['customer_facing'] 
     if form.cleaned_data['monitored'] != obj.monitored: 
      obj.monitored = form.cleaned_data['monitored'] 
     if form.cleaned_data['puppet'] != obj.puppet: 
      obj.puppet = form.cleaned_data['puppet'] 
     if form.cleaned_data['sso'] != obj.sso: 
      obj.sso = form.cleaned_data['sso'] 

     obj.save() 
関連する問題