在django中将动态变量从父模板传递给子模板

Posted

技术标签:

【中文标题】在django中将动态变量从父模板传递给子模板【英文标题】:passing dynamic variable from parent template to child template in django 【发布时间】:2020-09-27 01:25:21 【问题描述】:

我有一个模板songs.html,其中包含一个子模板addToPlaylist.html。我需要动态添加到播放列表的歌曲的标题。 这是songs.html 的代码,其中包括addToPlaylist.html

                % for song in songs  %
                <div class="col-16 col-sm-4 col-md-3 col-lg-2 single-album-item">
                    <div class="single-album">
                        <img src="MEDIA_URLsong.image.url" >
                        <div class="album-info">
                            <a href="% url 'playSong' 'song' song.tittle % ">
                                <h5>song.tittle</h5>
                            </a>
                            <p>song.album</p>
                            % include "songs/addToPlaylist.html" with song_to_add=song.tittle %
                            <a data-toggle="modal" href="#addToPlaylist" style="color: dimgrey; font-size: small;">Add to Playlist</a>
                        </div>
                    </div>
                </div>
                % endfor %

这是addToPlaylist.html的代码

              <div class="form-group" style="width: 100%;">
                  <ul class="list-group list-group-flush" style="width: 100%;">
                    % for playlist in playlists %
                    <li class="list-group-item"><a href="% url 'addToPlaylist' playlist.name song_to_add %">playlist.name</a></li>
                    % endfor %
                </ul>
                  </div>

但是为song_to_add 分配动态值不起作用。该变量不会向下传递给子模板。

这是传递播放列表值的views.py 代码

    if request.user.is_authenticated:
        playlists = Playlist.objects.filter()
    songs = Song.objects.all()
    return render(request, "songs\\songs.html", 'songs': songs, 'playlists':playlists,)

这是我的Song 模型

class Song(models.Model):
    GENRES = [
        ('Rock','Rock'),
        ('Hip Hop','Hip Hop'), 
        ('Blues', 'blues'), 
        ('Heavy Metal', 'Heavy Metal'), 
        ('Classical', 'Classical'), 
        ('Funk', 'Funk')]
    tittle = models.CharField(max_length=255)
    album = models.CharField(max_length=255, null = True, blank = True)
    genre = models.CharField(max_length = 30, choices=GENRES)
    image = models.ImageField(upload_to='images/', blank = True , null = True)
    songFile = models.FileField(upload_to='musics/', help_text=("Allowed type - .mp3, .wav, .ogg"))
    uploaded_at = models.DateTimeField(auto_now_add=True)

另外,我试过this solution。

【问题讨论】:

addToPlaylist.html 中,您正在迭代集合playlists,而您将song.title 作为song_to_add 从父模板传递。 @Moosa 我想要在父级中迭代的song.title 的值。所以我可以将相关歌曲添加到用户选择的播放列表中。 song.title 应该是点击了addToPlaylist 按钮的歌曲的标题。 我很好奇即使playlists 可以在子模板中访问。如果您能分享确切的错误,将会很有帮助。 @Moosa 是的 playlists 可在子模板中访问,但它是直接从视图传递的。我已经编辑了问题并包含了views.py 代码。 @Moosa 错误是这个NoReverseMatch at /song Reverse for 'addToPlaylist' with arguments '('broken', '')' not found. 1 pattern(s) tried: ['addToPlaylist/(?P&lt;playlist&gt;[^/]+)/(?P&lt;song&gt;[^/]+)$'] 因为song_to_add 是未定义的所以url 会导致问题。 【参考方案1】:

你的&lt;h5&gt;song.tittle&lt;/h5&gt;呢?如果你剪掉你的坏代码,它是否显示正常? 我认为您的 song.tittle 返回空字符串或 None 并且必须重写为 song.title

如果不适合您,请出示您的歌曲型号代码。

【讨论】:

yes &lt;h5&gt;song.tittle&lt;/h5&gt; 显示正常。但是当通过% include "songs/addToPlaylist.html" with song_to_add=song.tittle % 传递给子模板时,它返回 None 或者在那里未定义。 我已编辑问题并添加了我的Song 型号代码 你试过song.title而不是song_to_add中的% url %吗?您是否尝试在一些 spanp 标记中显示 song_to_add 是的 song.title 在父模板中的 spanp 中工作正常,但在子模板中未定义。 song.title 在 url 中使用时也不起作用。实际上我需要将song.title 的动态值传递给子模板,我做不到。【参考方案2】:

我通过将子模板 modal form 放在父模板文件中并将唯一 ID 分配给模态表单来解决我的问题。通过这种方式,我可以为每首歌曲单独调用addToPlaylist

【讨论】:

以上是关于在django中将动态变量从父模板传递给子模板的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Twig 中将变量从父模板传递到子模板?

在 React 中将数据从父级传递给子级

如何在Vue2中将数据从父级传递给子级

在 React-Router 中将状态作为道具从父级传递给子级?

如何在 django 的基于类的视图中将值传递给模板?

在 django 模板变量中将数字连接为字符串