【发布时间】:2016-02-11 16:12:21
【问题描述】:
我刚开始使用 Django,并且拥有以下内容:
models.py:
class Song(models.Model):
name = models.CharField(max_length=200, blank=False, null=False)
artist = models.ForeignKey(Artist, blank=False, null=False)
class Artist(models.Model):
name = models.CharField(max_length=200, unique=True)
现在我有一个 Song 的模型表单,但目前无法添加尚不存在的艺术家(呈现为下拉列表)。允许用户即时添加艺术家会很好,但还没有找到一种方法来实现这一点。我看到很多与复制管理员“添加另一个...”有关的答案,但一直遇到障碍和过时的信息。
我尝试了什么:
- 从管理控制台复制“添加另一个”
- 创建为常规表单 - 但放弃了它,因为 ModelForms 免费为我提供了很多功能
- 开始研究表单集,但卡在那里,找不到工作示例
有没有办法从歌曲表格中轻松添加另一位艺术家?我不介意在艺术家选择下方呈现一个新文本框,用户可以在其中添加新艺术家,但我不知道如何使用 ModelForms 执行此操作,然后在保存之前将艺术家添加到数据库中。
任何建议将不胜感激!
【问题讨论】:
-
您是说在创作歌曲的同时添加艺术家吗? “添加另一位艺术家”没有多大意义,因为每个
Song上只能有一个ForeignKey,对吧?如果您想创建任意数量的Artist,但不一定要连接到Song,我建议您分开进行,创建歌曲和创建艺术家是两个不同的过程。 -
@ShangWang 对不起,抱歉。 “添加另一个”是我经常看到的“添加一个不存在的艺术家并将其与这首歌相关联”的常用术语。假设我的艺术家表中没有艺术家。我想创作一首歌曲,并将其与涅槃相关联。我必须转到艺术家表格并将 Nirvana 添加为新艺术家,然后返回歌曲表格并从下拉列表中选择 Nirvana。我希望能够以文本形式或管理控制台中经常显示的小 (+) 符号的形式在歌曲形式中添加 Nirvana
-
这很棘手,它是可行的,但可能不是直截了当。您需要在
Song模型表单中排除artist,然后创建一个Artist模型表单并将两个表单一起传递给模板。您使用 javascript 显示/隐藏Artist取决于用户是否要创建新艺术家。然后在你的views.py中你会先保存Artist,然后是song = song_form.save(commit=False)和song.artist = artist,然后是song.save()。例如你可以在这里看到:stackoverflow.com/questions/22739701/… -
另一种方法是当你点击“+”艺术家按钮时重定向到艺术家创作页面,然后当艺术家创作完成后,重定向回歌曲创作页面。您可以通过添加类似
<artist_creation_url>/?from=<song_creation_url>的get 参数来控制重定向回歌曲创建页面。但是,这会使用户丢失表单中以前未完成的数据。
标签: python django django-forms modelform