我们说我有一个显示歌曲的网页。让我们说有公共和私人歌曲。公共歌曲可供所有人查看,而私人歌曲是某个用户创建的歌曲,仅供他观看。所以用户应该只看到那些包含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。
答案 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})
这种方式表单对象应该有权访问用户。