2016-11-22 107 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()