0

我有一个表单,其目的是让用户添加、编辑、减去和重新排序歌曲。JavaScript DOM 操作允许用户添加、减去和重新排序歌曲字段。重新排序是通过 jQuery UI 的可排序交互。歌曲的顺序很重要。

HTML 字段名称属性值重复。我没有使用 Django 生成表单。

假设提交时有两首歌曲,Firebug 显示的表单 DOM 看起来像这样(省略 csrf):

<form method="post" action="/save/">
    <ul id="sortable_songs" class="ui-sortable">
        <li>
            <input type="text" name="title" id="song_txt_1">
            <textarea id="more_info_txtarea_1" name="more_info"></textarea>
        </li>
        <li>
            <input type="text" name="title" id="song_txt_2">
            <textarea id="more_info_txtarea_2" name="more_info"></textarea>
        </li>
    </ul>
    <button type="submit">save</button>
</form>

示例查询字符串:

title=FOO&more_info=FOO+INFO&title=BAR&more_info=BAR+INFO

该模型:

class Song(models.Model):
    title = models.CharField(max_length=65)
    more_info = models.CharField(max_length=255)
    #todo: foreignkey to User

可能不会涉及太多数据,无论是在每条记录中还是关于每个用户的记录数。因此,我假设对于给定的用户,当提交表单时,我将删除他们在 Song 表中的所有歌曲实例并根据表单创建一堆新实例是有道理的。(与必须编辑现有记录并具有指示歌曲顺序的 db 字段相反)。

似乎我不应该编写自己的视图,所以我正在尝试 Django 的 generic CreateView,但也许不足为奇的是,上面的用户输入只创建了一个带有“BAR”和“BAR INFO”的模型实例 - 没有“FOO”实例制成。

有没有一种简单的方法来解决这个问题?

4

1 回答 1

0

您应该使用Formsets,这样您可以以简单的方式管理对象的多个实例,但是您需要控制一些额外的变量并格式化查询字符串。但所有内容都包含在文档中。

您将需要order模型中的一个字段:

class Song(models.Model):
    title = models.CharField(max_length=65)
    more_info = models.CharField(max_length=255)
    #todo: foreignkey to User
    order = models.PositiveIntegerField()

    class Meta:
        order_by = ['order']
        # to ensure database integrity
        unique_thogeter = [(user, order)]

您可能还需要更新您的创建视图,

class SongListCreate(CreateView):
    model = Song

    def get_context_data(self, *args, **kwargs):
        context = super(SongListCreate, self).get_context_data(*args, **kwargs)
        # add a song formset to the context
        # or a bound formset from validation
        return context

    def form_valid(self, form):
        formset = SongFormset(#post data)
        objects = formset.save(commit = False)
        objects.update(#user instance, 
        #and other data you might need like the new orders)
        objects.save()
        return super(SongListCreate, self).form_valid(form)

这大致是您可能需要做的,当您习惯使用表单集时,会有些困难。

您可能还想使用自定义库来轻松管理歌曲的顺序,例如向上或向下移动,例如django-positions

问候。

于 2013-11-06T23:03:54.630 回答