假设我有一个展示歌曲的网页。有公共和私人歌曲。公共歌曲可供所有人查看,而私人歌曲是某个用户创建的仅供该用户查看的歌曲。因此,用户应只能查看owner_id == NULL和owner_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
查看:
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)
注意表单文件中箭头所指的那一行。这就是问题所在。虽然代码现在可以运行,但
(owner = 3)
是硬编码的。我知道我的用户 id 是 3。但是我希望它能正常工作。应该像这样:
(owner = currently_logged_in_user.id)
我还非常新手使用 Django 和 Python,不知道如何将用户 id 传递给 SongInfoForm 表单模型。
def song_info(request):
,并且由于您在render中使用它:return render(request, 'songapp/song_info.html', [...]
,所以它应该可以工作。如果您正在使用带有调试的./manage.py runserver
,则应该会出现完整的跟踪问题的信息。由于我的答案直接来自Django 1.7文档,我不明白为什么会被投票反对。 - Dawid