【问题标题】:Django queryset calling only objects belonging to UserDjango 查询集只调用属于用户的对象
【发布时间】:2015-08-27 12:24:26
【问题描述】:

我无法弄清楚如何只调用 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() got multiple values for keyword argument 'user'。

这可能是因为我请求“会话”的方式吗?

【问题讨论】:

标签: django django-forms django-queryset


【解决方案1】:
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)

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

【讨论】:

  • 感谢但丁教授。所以我改变了我的表单和视图,但我遇到了一个错误,说它为用户找到了多个值。想法?
  • 是的,您的 init 签名错误 - 不要添加“用户”,它会自动添加为 kwarg,然后您将其解压缩。复制我的例子。
  • 啊,好的。它正在填充一个空白查询集。我假设这意味着它没有读取我在“用户”和“dropoffitem”之间建立的 ForeignKey 关系?我将更新我的 DropoffItem 模型。
  • 可能有很多原因 - 你必须调试你的代码。您请求的表单代码应该让您在正确的行!
  • 好的。感谢您的帮助!
猜你喜欢
  • 2021-10-26
  • 2018-02-09
  • 2020-05-22
  • 2017-01-13
  • 2021-10-17
  • 2013-12-11
  • 2011-03-04
  • 2014-02-06
相关资源
最近更新 更多