在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<playlist>[^/]+)/(?P<song>[^/]+)$']
因为song_to_add
是未定义的所以url 会导致问题。
【参考方案1】:
你的<h5>song.tittle</h5>
呢?如果你剪掉你的坏代码,它是否显示正常?
我认为您的 song.tittle
返回空字符串或 None 并且必须重写为 song.title
如果不适合您,请出示您的歌曲型号代码。
【讨论】:
yes<h5>song.tittle</h5>
显示正常。但是当通过% include "songs/addToPlaylist.html" with song_to_add=song.tittle %
传递给子模板时,它返回 None 或者在那里未定义。
我已编辑问题并添加了我的Song
型号代码
你试过song.title
而不是song_to_add
中的% url %
吗?您是否尝试在一些 span
或 p
标记中显示 song_to_add
?
是的 song.title
在父模板中的 span
和 p
中工作正常,但在子模板中未定义。 song.title
在 url 中使用时也不起作用。实际上我需要将song.title
的动态值传递给子模板,我做不到。【参考方案2】:
我通过将子模板 modal form
放在父模板文件中并将唯一 ID 分配给模态表单来解决我的问题。通过这种方式,我可以为每首歌曲单独调用addToPlaylist
。
【讨论】:
以上是关于在django中将动态变量从父模板传递给子模板的主要内容,如果未能解决你的问题,请参考以下文章