我有一个表单,其目的是让用户添加,编辑,减去和重新排序歌曲。 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”实例。
有一个简单的方法吗?
答案 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。
问候。