2016-11-22 104 views
0

我有一個與另一個manytomany關係的模型。我遵循https://gist.github.com/jdklub/9261959的示例,使manytomany字段可以從更改列表視圖進行編輯。但是,當我做出更改時,只有對多人區域的更改實際上得到保存。更改不保存在Django管理更改列表視圖

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 

我甚至嘗試刪除從的ModelForm和變更表的多對多領域的所有引用,但沒有的字段保存。它不會給出任何錯誤,並且會提供記錄已保存的消息,但沒有任何更改會持續存在。

回答

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()