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

时间:2015-07-14 11:43:52

标签: 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

查看:

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

形式:

    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)

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

  

(所有者= 3)

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

  

(owner = current_logged_in_user.id)

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

2 个答案:

答案 0 :(得分:2)

我已经明白了。

在views.py中更改:

form = SongInfoForm(initial={'song_list': song.song_list}, user=request.user)

感谢前面的答案和这个例子 django form: Passing parameter from view.py to forms gives 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)

答案 1 :(得分:0)

好吧,我的不好。没看过才能看到问题出在表格中,但根据这篇文章:https://stackoverflow.com/a/5122029/2695295你可以像这样改写你的:

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

这种方式表单对象应该有权访问用户。