如何在 Django 1.7 的表单模型中获取当前登录的用户 ID?

Saš*_*aba 3 python django

假设我有一个显示歌曲的网页。假设有公共歌曲和私人歌曲。公开歌曲是所有人都可以看到的,而私人歌曲是某个用户自己创建的、只有他自己可以看到的歌曲。所以用户应该只看到那些具有owner_id == NULL和owner_id == current_logged_in_user_id(他自己的id)的歌曲

模型:

import ....

    class Song(models.Model):
        name = models.CharField(max_length=100)    
        duration = models.IntegerField(max_length=15)
        owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)

        def __unicode__(self):
            return self.name
Run Code Online (Sandbox Code Playgroud)

看法:

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from songapp.models import Song
from songapp.forms import SongInfoForm

@login_required
def song_info(request):
    song = get_object_or_404(Box)
    song_status = song.get_status()
    form = SongInfoForm(initial={'song_list': song.song_list})

    return render(request, 'songapp/song_info.html',
        {'form': form, 'song': song, 'song_status': song_status})
Run Code Online (Sandbox Code Playgroud)

形式:

    from django import forms
    from django.forms import ModelChoiceField

    from songapp.models import Song


    class SongInfoForm(forms.Form):

-->     selected_songs = Song.objects.filter(owner=None) | Song.objects.filter(owner=3)
        song_list = ModelChoiceField(queryset=selected_songs, required=False)
Run Code Online (Sandbox Code Playgroud)

请注意表单文件中带有箭头的行。这就是问题所在。该代码现在可以运行,但是

(所有者 = 3)

是硬编码的。我知道我的用户 ID 是 3。但我希望它能够正常工作。它应该是这样的:

(所有者 = current_logged_in_user.id)

我对 Django 和 Python 还很陌生,我不知道如何将用户 id 传递给 SongInfoForm FormModel。

Saš*_*aba 5

我已经弄清楚了。

在views.py中更改:

form = SongInfoForm(initial={'song_list': song.song_list}, user=request.user)
Run Code Online (Sandbox Code Playgroud)

感谢之前的答案和这个示例 django 表单:Passing parameter from view.py to forms gets out error 我已经想出了这个,它的工作原理就像一个魅力。

在forms.py中

class SongInfoForm(forms.Form):
    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(SongInfoForm, self).__init__(*args, **kwargs)
        self.fields['song_list'] = forms.ModelChoiceField(queryset=Song.objects.filter(owner=None) | Song.playlist.objects.filter(owner=user), required=False)
Run Code Online (Sandbox Code Playgroud)