Django过滤ModelChoiceField的查询集

时间:2013-03-25 06:18:46

标签: django

我一直在使用一个名为ModelChoiceField的表单字段并查询所有对象,但这并不是我打算用它来实现的。

 class PictureForm(forms.ModelForm):
    Whiteboard = forms.ModelChoiceField(queryset=Whiteboard.objects.all())

我一直在尝试使用ModelChoiceField来查询属于特定用户的所有WhiteBoard对象

Whiteboard = forms.ModelChoiceField(queryset=Whiteboard.objects.filter(user=request.user))

但我发现请求没有传递给ModelForm。我一直在搜索SO以寻求各种解决方案,一种解决方案是覆盖表单的 init ()

这可能是与我的问题有关的最接近的问题 How to use the request in a ModelForm in Django

这是他的解决方案。如果他的解决方案是覆盖视图中的查询集。他如何在forms.py

中创建没有查询集的ModelChoiceField

就我而言,我希望用户过滤掉所有白板。我怎么能这样做?

我的模块的一部分

class Whiteboard(models.Model):

    Category =models.CharField(max_length=30,choices=CATEGORY)
    user = models.ForeignKey(User)
    name = models.CharField(max_length=100)
    picture = models.OneToOneField('Picture',related_name='picture',blank=True,null=True)
    def __unicode__(self):
        return self.name

class Picture(models.Model):
    user = models.ForeignKey(User)
    Whiteboard = models.ForeignKey(Whiteboard,blank=False,null=False,related_name='board')
    image = models.FileField(upload_to="images/",blank=True)
    description = models.TextField()
    is_primary = models.BooleanField(default=False)

    def __unicode__(self):
        return self.description

我的views.py

def PictureCreator(request):
if not request.user.is_authenticated():
    return HttpResponseRedirect(reverse('world:LoginRequest'))

if request.method == "POST":
    form = PictureForm(request.POST , request.FILES)
    if form.is_valid():
        picture = Picture(user=request.user)
        image = request.FILES.get('image')
        if image:
                            picture.image = form.cleaned_data['image']
                    description = form.cleaned_data['description']
        if description:
                            picture.description = form.cleaned_data['description']

        if board:
                            picture.board = form.cleaned_data['board']
        picture.save()
        board = Whiteboard.objects.get(Whiteboard=picture.board)
        the_id = board.id
    return HttpResponseRedirect(reverse('world:Boat', kwargs={'animal_id': the_id }))   

return render(request,'picture.html',{'form':PictureForm()})

picture.html

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
{{ form.as_p }}
<input type = "submit" value= "Add Picture" />
 </form>

2 个答案:

答案 0 :(得分:8)

在类定义期间,根本不要设置过滤器。您将在视图中覆盖它。

form = PictureForm()
form.fields['whiteboard'].queryset = Whiteboard.objects.filter(user=request.user)

class PictureForm(ModelForm):
   whiteboard = forms.ModelChoiceField(queryset=Whiteboard.objects.none(),)

答案 1 :(得分:3)

user中传递init,然后在视图中的表单中,您必须传递用户值PictureForm(request.user)

class PictureForm(forms.ModelForm):
    class Meta:
        model = Picture

    def __init__(self, user, *args, **kwargs):
        super(PictureForm, self).__init__(*args, **kwargs)
        self.fields['Whiteboard'].queryset = Whiteboard.objects.filter(user=user)


def PictureCreator(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect(reverse('world:LoginRequest'))

    if request.method == "POST":
        form = PictureForm(request.user, request.POST, request.FILES)
        if form.is_valid():
            picture = Picture(user=request.user)

            image = request.FILES.get('image')
            if image:
                picture.image = form.cleaned_data['image']

            description = form.cleaned_data['description']
            if description:
                picture.description = form.cleaned_data['description']

            if board:
                picture.board = form.cleaned_data['board']
            picture.save()

            board = Whiteboard.objects.get(Whiteboard=picture.board)
            the_id = board.id
        return HttpResponseRedirect(reverse('world:Boat', kwargs={'animal_id': the_id }))   
    return render(request,'picture.html',{'form':PictureForm(request.user)})