Python 如何在Django 1.7的表单模型中获取当前登录的用户id?
假设我有一个显示歌曲的网页。假设有公共和私人歌曲。公共歌曲可供所有人观看,而私人歌曲是特定用户创建的歌曲,仅可供其观看。因此,用户应该只看到所有者id==NULL和所有者id==当前登录用户id(他自己的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
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'未定义”错误