我可以使用CreateView创建多个模型实例吗?

时间:2013-11-06 20:13:25

标签: django

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

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的通用CreateView,但也许不出所料,上面的用户输入只有一个带有“BAR”和“BAR INFO”的模型实例。创建了-no“FOO”实例。

有一个简单的方法吗?

1 个答案:

答案 0 :(得分: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)

这大致是您可能需要做的事情,在您习惯时使用formset非常困难。

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

问候。