django在表单中获取登录用户来构建queryset?

时间:2014-04-03 19:00:33

标签: django django-models django-forms django-users

我有这个型号:

class Searches(models.Model):
    user = models.ForeignKey(User)
    .....other fields

每个user都有一些已保存的搜索。我想显示form(a choiceSelect widget)以选择其中一个搜索,然后点击go。我希望filter中的form仅显示该特定searches的{​​{1}}。这是我试过的。但下面的User不起作用。如何解决这个问题?

这是我的表格:

request.user

编辑: 我的观点:

class SearchesForm(forms.Form):
    #get the queryset for the searches model of logged in user
    qset=Searches.objects.filter(user=request.user) ----> error
    #get the most recent entry
    default=Searches.objects.latest('id')
    choices = forms.ModelChoiceField(queryset=qset,label='select search',initial=default)

1 个答案:

答案 0 :(得分:5)

在服务器启动时创建查询集的instance,并且当时不知道requestrequest特定于每个request

在视图中创建表单时,您必须将请求传递到表单__init__

class SearchesForm(forms.Form):
    choices = forms.ModelChoiceField(queryset=Searches.objects.none(),
                                     label='select search')

    def __init__(self, request, *args, **kwargs):
        super(SearchesForm, self).__init__(*args, **kwargs)
        if request.user:
            queryset = Searches.objects.filter(user=request.user)
        else:
            queryset = Searches.objects.all()
        latest = queryset.latest('id')
        self.fields['choices'].queryset = queryset

def my_view(request):
    if request.method == 'POST':
        form = SearchesForm(request, request.POST)
        if form.is_valid():
            # return search template here.
            return render(...)
    else:
        form = SearchesForm(request, request.POST)
    return render(request, 'template_name.html', {'form': form})