Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django 1.7的表单模型中获取当前登录的用户id?_Python_Django - Fatal编程技术网

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

Python 如何在Django 1.7的表单模型中获取当前登录的用户id?,python,django,Python,Django,假设我有一个显示歌曲的网页。假设有公共和私人歌曲。公共歌曲可供所有人观看,而私人歌曲是特定用户创建的歌曲,仅可供其观看。因此,用户应该只看到所有者id==NULL和所有者id==当前登录用户id(他自己的id)的歌曲 型号: import .... class Song(models.Model): name = models.CharField(max_length=100) duration = models.IntegerField(max

假设我有一个显示歌曲的网页。假设有公共和私人歌曲。公共歌曲可供所有人观看,而私人歌曲是特定用户创建的歌曲,仅可供其观看。因此,用户应该只看到所有者id==NULL和所有者id==当前登录用户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
视图:

表格:

注意表单文件中带箭头的行。这就是问题所在。代码现在可以工作了,但是

(所有者=3)

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

class SongInfoForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        self.user = user
        super(SongInfoForm, self).__init__(*args, **kwargs)

    selected_songs = Song.objects.filter(owner=None) | Song.objects.filter(owner=user.id)
    song_list = ModelChoiceField(queryset=selected_songs, required=False)
form = SongInfoForm(request.user, initial={'song_list': song.song_list})
(所有者=当前登录用户id)


我还是Django和Python的新手,我不知道如何将用户id传递给SongInfoForm FormModel。

好吧,我的错。没有读到足够多的书,看不出表单中存在的问题,但根据这篇文章:你可以像这样重写你的表单:

class SongInfoForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        self.user = user
        super(SongInfoForm, self).__init__(*args, **kwargs)

    selected_songs = Song.objects.filter(owner=None) | Song.objects.filter(owner=user.id)
    song_list = ModelChoiceField(queryset=selected_songs, required=False)
form = SongInfoForm(request.user, initial={'song_list': song.song_list})
然后在视图中创建如下表单:

class SongInfoForm(forms.Form):
    def __init__(self, user, *args, **kwargs):
        self.user = user
        super(SongInfoForm, self).__init__(*args, **kwargs)

    selected_songs = Song.objects.filter(owner=None) | Song.objects.filter(owner=user.id)
    song_list = ModelChoiceField(queryset=selected_songs, required=False)
form = SongInfoForm(request.user, initial={'song_list': song.song_list})
这样,表单对象应该可以访问用户

我已经弄明白了

在views.py更改中:

form = SongInfoForm(initial={'song_list': song.song_list}, user=request.user)
感谢前面的答案和这个例子 我想出了这个,它就像一个符咒

在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)

我收到一个错误“名称‘请求’未定义”。我以前试过,但没用。也许我需要像“from django.http import HttpRequest”这样的导入?请记住,我对此非常陌生。不,因为
request
是传递到此处视图的对象:
def song\u info(request):
并且由于您在render中使用它:
return render(request,'songapp/song\u info.html',[…]
它应该可以正常工作。如果你在调试中使用
/manage.py runserver
,应该可以完全跟踪问题发生的位置。由于我的答案直接来自Django 1.7文档,我不理解否决票。我没有否决你,但这里有一个向上的投票来平衡它:/。异常位置报告说问题就在上面提到的forms.py文件中的同一行。仍然不起作用,但感谢您的尝试。@Dawid不,这不可能起作用。该行不在视图或模板中,而是在表单类的定义中。无法访问那里的请求。我自己在过去半个小时内遇到了这个解决方案,我仍然使用它t错误。我在您发布代码时修改了代码,但在“form=songform(request.user,initial={'song_list':song.song_list}”行中出现“name'user'未定义”错误