【问题标题】:django ModelForm foreign key - text widget add if not existdjango ModelForm 外键 - 如果不存在则添加文本小部件
【发布时间】: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 的模型表单,但目前无法添加尚不存在的艺术家(呈现为下拉列表)。允许用户即时添加艺术家会很好,但还没有找到一种方法来实现这一点。我看到很多与复制管理员“添加另一个...”有关的答案,但一直遇到障碍和过时的信息。

我尝试了什么:

  1. 从管理控制台复制“添加另一个”
  2. 创建为常规表单 - 但放弃了它,因为 ModelForms 免费为我提供了很多功能
  3. 开始研究表单集,但卡在那里,找不到工作示例

有没有办法从歌曲表格中轻松添加另一位艺术家?我不介意在艺术家选择下方呈现一个新文本框,用户可以在其中添加新艺术家,但我不知道如何使用 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


【解决方案1】:

这将有助于查看您用于创建表单的内容。我假设您使用的是 ModelFrom。如果您使用的是 jQuery,我认为您可以在 forms.py 中使用以下内容来捕捉新艺术家。但是,如果您使用 jQuery,我会将单个表单保存为模板,并根据新艺术家的按钮或链接事件在必要时显示它们。

forms.py

class SongForm (forms.ModelForm):
    new_artist_name = forms.CharField()

    class Meta:
        model = Song

    def save(self, commit=True):
        # do something with self.cleaned_data['new_artist']
        new_artist = Artists.objects.filter('new_artist_name')
        if new_artist.exists():
            # Save song to artist.
        else:
            # Create and save new artist and save song to the
            # new artist.

        return super(SongForm, self).save(commit=commit)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-08
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    相关资源
    最近更新 更多