我多次在Django上看过formset和model formset,但我仍然无法想出这样做的聪明方法。
我有两种模式:
Group
Person
我有一个查询集,其中包含所有尝试加入特定组的人:Person.objects.filter(wantsToJoinGroup=groupD)
现在,我想要做的是显示一个页面,每个人想要加入特定组的一侧有一个复选框。然后可以检查这些复选框,然后单击“接受组”按钮。我希望这可以将这些人批量添加到某个群体中。
我不明白该怎么做才是复选框。我一直试图扩展modelform
,然后从中formset
,但我每次都失败了。好像我想用模型做formset
我应该使用modelformset
,但这不允许我扩展表单以添加复选框。我该怎么办?
这是关于我想要的油漆的10秒草稿:
alt text http://img403.imageshack.us/img403/1002/draft.png
所以它基本上是一个复选框和一种在模板上访问人物模型的方法,然后是在视图上处理此模型的方法。
提前致谢!
修改顺便说一下,在有人建议使用ModelMultipleChoiceField
之前,除非有办法访问模板中的每个对象,否则这将无法满足我的需求去做。据我所知,我不能在模板上迭代ModelMultipleChoiceField的对象。如果我错了,请纠正我!
答案 0 :(得分:1)
如果你没有使用模型形式的想法,我会使用一个带有ModelMultipleChoiceField的常规表单,在__init__
中为它提供一个查询集,然后将相同的查询集提供给模板上下文(在你的闲暇时间迭代):
#view
def add_to_group(request):
persons = Person.objects.filter(wantsToJoinGroup=groupD)
if request.POST:
form = PersonAddForm(persons, request.POST)
if form.is_valid():
#your handling logic
form = PersonAddForm(persons)
context = {'persons': persons, 'form': form}
return render_to_response(template, context)
#form
class PersonAddForm(forms.Form):
def __init__(self, queryset, *args, **kwargs):
super(PersonAddForm, self).__init__(*args, **kwargs)
self.fields['persons'] = forms.ModelMultipleChoiceField(queryset=queryset,
widget=forms.CheckboxSelectMultiple() )
答案 1 :(得分:1)
您实际上可以通过以下方式访问ModelMultipleChoiceField的项目:
my_field.field.queryset
其中my_field是ModelMultipleChoiceField的实例。
答案 2 :(得分:0)
在我的头顶,你可以插入一个名为'Action'的隐藏字段。在“接受”和“拒绝”按钮的onclick事件中,相应地设置隐藏字段的值,然后提交表单。
在您的视图中,检查隐藏字段的值,以确定它是接受还是拒绝。