如何使用用户数据呈现表单?

时间:2013-03-24 23:54:03

标签: django django-forms django-users

如何创建一个django表单来显示用户的销售对象,并在每个obejct旁边放置一个用于删除的单选框? 我正在尝试创建类似于django admin的东西,其中用户列出了用于快速删除的无线电盒。

django forms

从request.user我试图从用户那里获取Sell的关联对象并返回一个列表 销售以删除所选。到目前为止,我的个人资料表格如下:

class ProfileForm(ModelForm):
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop("request")
        super(ProfileForm, self).__init__(*args, **kwargs)

    sells = forms.IntegerField(
        widget=forms.Select(
            sell=Sell.object.filter(user=self.request.uwer)
        )
    )

在views.py中,我打算删除所选的销售对象,如下所示:

for sell in form.sells:
    sell = Sell.objects.get(id=sell)
    sell.delete()

1 个答案:

答案 0 :(得分:1)

这里有很多不妥之处。最重要的是您无法在表单定义中设置选项,因为您无权访问request.user

无论如何,我认为你不想要一个模型形式。这些用于创建和编辑模型实例,而您只想用复选框列出现有实例。所以你只需要一个带有代表那些实例的字段的普通表单,即ModelMultipleChoiceField。

因此,表单如下所示:

class DeleteSellForm(forms.Form):
    sells = forms.ModelMultipleChoiceField(queryset=Sell.objects.none(),
                                           widget=forms.CheckboxSelectMultiple)

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(DeleteSellForm, self).__init__(*args, **kwargs)
        self.fields['sells'].queryset=Sell.objects.filter(user=user)

您会注意到查询集默认为none,但在__init__方法中设置为正确的用户对象,我们可以在其中传入用户。

所以视图看起来像这样:

def delete_sells(request):
    if request.POST:
        form = DeleteSellsForm(request.POST, user=request.user)
        if form.is_valid():
            form.cleaned_data['sells'].delete()
    else:
        form = DeleteSellsForm(user=request.user)
    return render(request, 'template.html', {'form': form})

ModelMultipleChoiceField清除查询集,因此您应该可以直接在其上调用delete()