1

如何创建一个 django 表单来显示用户的销售对象,每个对象旁边都有一个单选框以供删除?我正在尝试创建类似于 django admin 的内容,其中列出了用户并带有单选框以便快速删除。

django 表单

从 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()
4

1 回答 1

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清理为 QuerySet,因此您应该可以delete()直接调用它。

于 2013-03-25T08:12:34.733 回答