html Django通过download属性获取下载次数

mlnl4t2r  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(124)

我正在用Django做一个项目,比如一个音乐播放器,这是我的模型:

class Song(models.Model):
    """Model representing a song"""
    name = models.CharField(
        max_length=200, help_text=_('Enter a song name'))
    image = models.ImageField(
        upload_to='cover_image')
    content = models.FileField(upload_to='songs')
    artist = models.ForeignKey(User, on_delete=models.CASCADE)
    status = models.BooleanField(
        default=False,
        help_text=_('Check this box to make the song public')
    )

由于我已经配置了上传的文件夹和所有,所有我必须做的是在我的模板添加下载属性的标签,它将下载文件的用户

<a href="/media/{{ i.content }}" download="{{ i.name }}" type="video/mp4">
            <button class="btn btn-outline-danger">Download Song </button>
          </a>

这工作完美,但它被证明是相当困难的,如果我想得到下载计数的歌曲。我在考虑给它一个onclick属性,这样当我点击download按钮时,它会触发一个JavaScript函数,向视图发送一个隐藏的表单,以增加downloads值。然而,我认为这是相当复杂的,所以我想知道是否有一个更好的方法来做到这一点。

p3rjfoxz

p3rjfoxz1#

在Django中有多种方法来跟踪歌曲的下载计数。

  • 一种方法是使用单独的模型来跟踪下载计数并在下载发生时更新它。

创建一个新模型来跟踪下载计数:

class Download(models.Model):
    song = models.ForeignKey(Song, on_delete=models.CASCADE)
    count = models.PositiveIntegerField(default=0)

更新视图以处理下载请求并增加下载计数:

from django.shortcuts import get_object_or_404

def download_song(request, song_id):
    song = get_object_or_404(Song, pk=song_id)
    
    # Increment the download count
    download, created = Download.objects.get_or_create(song=song)
    download.count += 1
    download.save()
    
    # Return the file for download
    file_path = song.content.path
    with open(file_path, 'rb') as f:
        response = HttpResponse(f.read(), content_type='application/octet-stream')
        response['Content-Disposition'] = 'attachment; filename=' + os.path.basename(file_path)
        return response

更新您的模板,以便在单击Download按钮时调用download_song视图

<a href="{% url 'download_song' i.id %}" download="{{ i.name }}" type="video/mp4">
    <button class="btn btn-outline-danger">Download Song</button>
</a>

为urls.py中的download_song视图添加URL模式

from django.urls import path
from .views import download_song

urlpatterns = [
    # Other URL patterns
    path('download/<int:song_id>/', download_song, name='download_song'),
]
  • 在Django中跟踪歌曲下载计数的另一种方法是使用Django的内置middleware
class DownloadCountMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)

        # Check if the response is a file download
        if response.get('Content-Disposition', '').startswith('attachment'):
            song_id = request.GET.get('song_id')
            if song_id:
                song = get_object_or_404(Song, pk=song_id)
                song.download_count += 1
                song.save()

        return response

在Django设置中注册中间件类

MIDDLEWARE = [
    # Other middleware classes
    'yourapp.middleware.DownloadCountMiddleware',
]

更新您的模板,以便在单击下载按钮时将歌曲ID作为查询参数传递

<a href="/media/{{ i.content }}?song_id={{ i.id }}" download="{{ i.name }}" type="video/mp4">
    <button class="btn btn-outline-danger">Download Song</button>
</a>

相关问题