Django queryset只调用属于User的对象

时间:2015-06-11 17:01:44

标签: django django-forms django-queryset

我无法弄清楚如何只调用django表单中属于特定用户的项目的查询集。

dropoffs / models.py

class DropoffItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True)
    dropoff = models.ForeignKey('Dropoff', null=True, blank=True)
    product = models.ForeignKey(Product)
    location = models.CharField(max_length=120, choices=LOCATION_CHOICES, default="Customer")

    def __str__(self):

        return str('%s' + " " + "(" + '%s' + ")") %(self.product.title, self.product.sku)

    def sku(self):
        return self.product.sku

    def title(self):
        return self.product.title

    def dropoff_id(self):
        return str(self.dropoff.id)

forms.py

class AddPickupItemForm(forms.ModelForm):
    dropoffitem = forms.ModelChoiceField(queryset=DropoffItem.objects.none())

    class Meta:
        model = PickupItem
        # fields = ["product", "quantity"]
        fields = ['dropoffitem']

    def __init__(self, user, *args, **kwargs):
        # self.request = kwargs.pop("request")
        the_user = kwargs.pop('user', None)
        super(AddPickupItemForm, self).__init__(*args, **kwargs)
        if the_user is not None:
            self.fields["dropoffitem"].queryset = DropoffItem.objects.filter(user=the_user)

views.py

def add_item_to_pickup_order(request):
    request.session.set_expiry(120000)

    try:
        user = request.user
        the_id = request.session['pickup_id']               
        pickup = Pickup.objects.get(id=the_id)          
    except:
        user = request.user                                 
        new_pickup_order = Pickup(user=user)                
        new_pickup_order.save()
        request.session['pickup_id'] = new_pickup_order.id          

        the_id = new_pickup_order.id
        pickup = Pickup.objects.get(id=the_id)                  

    try:
        dropoffitem = DropoffItem.objects.filter(user=user)
    except DropoffItem.DoesNotExist:
        pass
    except:
        pass

    form = AddPickupItemForm(request.POST, user=request.user)
    if request.method == "POST":

        dropoffitem_id = int(request.POST['dropoffitem'])
        pickup_item = PickupItem.objects.create(pickup=pickup, dropoffitem_id=dropoffitem_id)

        pickup_item.save()


        return HttpResponseRedirect('%s'%(reverse('add_item_to_pickup_order')))

    context = {

        "pickup": pickup,
        "form": form,

    }
    return render(request, 'pickups/create_pickup_order.html', context)

通过对 init 的修改,我得到的TypeError为: init ()为关键字参数' user'提供了多个值。

这可能是因为我要求一个'会话'?

1 个答案:

答案 0 :(得分:2)

class AddPickupItemForm(ModelForm):

    def __init__(self,*args,**kwargs)
        the_user = kwargs.pop('user',None)
        super(AddPickupItemForm, self).__init__(*args,**kwargs)
        if the_user is not None:
            self.fields['dropoffitem'].queryset = DropOffItem.objects.filter(user=the_user)

换句话说,如果需要,请在实例化时将用户传递给表单。