0
我想在Django管理站点的列表视图(使用可编辑)中的整数字段(序列)实现交换功能。我的代码:如何做列表中的全局验证可编辑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)。我怎样才能获得这些价值?
在此先感谢。