如何创建一个django表单来显示用户的销售对象,并在每个obejct旁边放置一个用于删除的单选框? 我正在尝试创建类似于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()
答案 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()
。