【问题标题】:How to render a form with a user's data?如何使用用户数据呈现表单?
【发布时间】:2013-03-14 09:23:29
【问题描述】:

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

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

【问题讨论】:

    标签: django django-forms django-users


    【解决方案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()

    【讨论】:

    • 糟糕,我实际上是想使用 form.Form。 Model.forms 需要class Meta:...。谢谢!这有效!
    • 还有一个问题,为什么我们需要弹出用户?如user = kwargs.pop('user', None)
    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 2018-10-04
    • 2013-01-31
    相关资源
    最近更新 更多