我正在尝试在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)。我怎样才能获得这些价值观?
提前致谢。