我一直在寻找一种方法,使用户可以轻松更改表单集中的条目顺序。我发现a StackOverflow question解决了这个问题,接受的答案引用了使用jQuery工具允许条目的拖放的Django Snippet。这很漂亮很酷,但是我对“额外”条目有疑问。如果修改了“额外”条目然后将其拖动,则提交时会出现错误:
(1048, "Column 'order' cannot be null")
我相信Django会将“额外”条目分开,因为它们必须插入而不是更新。因此,重新排序可能会使事情变得困惑。有没有办法使这项工作有效,或者还有其他建议来重新排序和/或添加新条目?

编辑:添加了一些相关的代码摘录。如片段所示,我正在管理员中尝试此操作。但是,我最终希望将其放在自己的页面中。

models.py:

class Section(models.Model):
    section_id = models.AutoField(primary_key=True)
    section_name = models.CharField(max_length=135)
    score_order = models.IntegerField()
    def __unicode__(self):
      return self.section_name
    class Meta:
        db_table = u'section'
        ordering = [u"score_order"]

class Chair(models.Model):
    chair_id = models.AutoField(primary_key=True)
    member = models.ForeignKey(Member, null=True, blank=True,
      limit_choices_to={'current_member': True})
    section = models.ForeignKey(Section)
    description = models.CharField(max_length=135)
    order = models.IntegerField(blank=True, null=True)
    def __unicode__(self):
      return "%s - %s" % (self.description, self.member)
    class Meta:
        db_table = u'chair'
        ordering = (u'section', u'order')

管理员
class SectionForm(forms.ModelForm):
    model = Section
    class Media:
        js = (
            '/scripts/jquery.js',
            '/scripts/ui.core.js',
            '/scripts/ui.sortable.js',
            '/scripts/section-sort.js',
        )

class ChairInline(admin.StackedInline):
    model = Chair

admin.site.register(Section,
                    inlines = [ChairInline],
                    form = SectionForm,
)

最佳答案

我找到了自己的解决方案。该代码段正在为具有非空主键值的每一行设置顺序。但是多余的行有一个空的主键,我相信它们必须留空,以便Django知道要插入而不是更新它们。我修改了函数以检查其他字段是否为空(幸运的是,我只有几个)以及主键:

jQuery(function($) {
    $('div.inline-group').sortable({
        items: 'div.inline-related',
        handle: 'h3:first',
        update: function() {
            $(this).find('div.inline-related').each(function(i) {
                if ($(this).find('input[id$=chair_id]').val() ||
                  $(this).find('select[id$=member]').val() ||
                      $(this).find('select[id$=description]').val()) {
                    $(this).find('input[id$=order]').val(i+1);
                }
            });
        }
    });
    $('div.inline-related h3').css('cursor', 'move');
    $('div.inline-related').find('input[id$=order]').parent('div').hide();
});

这对我有用。我可能会通过在行中的任何字段被修改时将隐藏字段添加到设置的表单中来进行改进。但是目前我仍然是jQuery n00b,所以可以。如果有人有更好的主意,请随时发表评论或添加其他答案。

10-05 21:06
查看更多