如何在列表可编辑的django管理站点

时间:2015-07-20 01:57:22

标签: python django django-admin

我正在尝试在Django管理站点的列表视图中使用整数字段(序列)实现交换功能(使用可编辑的)。我的代码:

models.py

class SortedMonitorables(models.Model):


    sequence = models.PositiveSmallIntegerField()
    monitorable_id = models.CharField(max_length=80, primary_key=True)

    def __unicode__(self):
        return u'{}-{}'.format(
             self.sequence, self.monitorable_id)

    class Meta(object):
        ordering = ['sequence']

forms.py

class SortedMonitorablesAdminForm(ModelForm):


    class Meta:
        model = SortedMonitorables

    def clean_sequence(self):
        """Manually sequence validation."""
        try:
            sequence = self.cleaned_data['sequence']
            monitorable_id = self.instance.monitorable_id
            records = SortedMonitorables.objects.filter(sequence=sequence).\
                exclude(monitorable_id=monitorable_id).count()
            if records >= 1:
                raise ValidationError(
                    'Sequence {} is already defined'.format(sequence))
        except ValidationError as e:
            raise ValidationError(e)
        except Exception:
            raise ValidationError('Fatal error checking sequence')
        else:
            return sequence

admin.py

@admin.register(SortedMonitorables)
class SortedMonitorableAdmin(admin.ModelAdmin):

    form = SortedMonitorablesAdminForm

    list_display = ('monitorable_id', 'sequence')
    list_display_links = ('monitorable_id',)
    list_editable = ('sequence',)
    search_fields = ['monitorable_id']
    list_per_page = 10

    def get_readonly_fields(self, request, obj=None):
        """Make some fields readonly on edition."""
        if obj:
            return self.readonly_fields + ('monitorable_id',)
        return self.readonly_fields

    def get_changelist_form(self, request, **kwargs):
        """Setting form to use in formset."""
        return SortedMonitorablesAdminForm

在管理网站中,我有类似的内容:

monitorable_id    sequence

'aa'                | 1 |
'bb'                | 2 |
'cc'                | 3 |

在该列表中,我可以直接修改序列,并且我为序列字段定义的验证(唯一值)在编辑和列表页面中都很有效。当用户想要在列表页面中交换序列值时,我的问题就出现了,即:用户想要更改' aa'和' bb'同时,得到类似的东西:

monitorable_id    sequence

'aa'                | 2 |
'bb'                | 1 |
'cc'                | 3 |

当这种情况发生时,用户会收到错误,因为唯一序列验证检测到这两个数字已被另一个监视定义/使用。我希望在Django使用SortedMonitorablesAdminForm验证列表中的每一行之前,可以使该列表中的所有序列值都可编辑(来自formset)。我怎样才能获得这些价值观?

提前致谢。

1 个答案:

答案 0 :(得分:0)

一位同事向我推荐了一款能够满足我需求的应用程序,所以你可以找到它here!使用该应用程序我不需要验证交换功能,因为在模板中,您当时只能更新一行。