Gor*_*ran 14 django django-templates django-models django-forms django-views
我需要帮助表单看起来像Gmail收件箱并有多个操作.有一个项目列表,我想用表格包装它,在每个项目的前面有复选框的方式.因此,当用户选择几个项目时,他可以单击具有不同操作的两个按钮,例如删除和标记读取.
<form action="">
{% for item in object_list %}
<input type="checkbox" id="item.id">
{{ item.name }}
{% endfor %}
<button type="submit" name="delete">Delete</button>
<button type="submit" name="mark_read">Mark read</button>
</form>
Run Code Online (Sandbox Code Playgroud)
我可以找到哪个提交按钮是用户点击如果使用if 'delete' in request.POST但我不能参考任何形式,因为我认为Django形式不能被定义为未知数量的字段.那么如何在视图中处理所选项目?
if request.method == 'POST':
form = UnknownForm(request.POST):
if 'delete' in request.POST:
'delete selected items'
if 'mark_read' in erquest.POST:
'mark selected items as read'
return HttpResponseRedirect('')
Run Code Online (Sandbox Code Playgroud)
Tho*_*mas 28
具有相同名称的多个复选框都是相同的字段.
<input type="checkbox" value="{{item.id}}" name="choices">
<input type="checkbox" value="{{item.id}}" name="choices">
<input type="checkbox" value="{{item.id}}" name="choices">
Run Code Online (Sandbox Code Playgroud)
您可以使用单个django表单字段收集和聚合它们.
class UnknownForm(forms.Form):
choices = forms.MultipleChoiceField(
choices = LIST_OF_VALID_CHOICES, # this is optional
widget = forms.CheckboxSelectMultiple,
)
Run Code Online (Sandbox Code Playgroud)
具体来说,您可以使用ModelMultipleChoiceField.
class UnknownForm(forms.Form):
choices = forms.ModelMultipleChoiceField(
queryset = queryset_of_valid_choices, # not optional, use .all() if unsure
widget = forms.CheckboxSelectMultiple,
)
if request.method == 'POST':
form = UnknownForm(request.POST):
if 'delete' in request.POST:
for item in form.cleaned_data['choices']:
item.delete()
if 'mark_read' in request.POST:
for item in form.cleaned_data['choices']:
item.read = True; item.save()
Run Code Online (Sandbox Code Playgroud)
小智 5
我无法评论Thomas解决方案,所以我在这里做.
对于ModelMultipleChoiceField,参数名称不是选项而是queryset.
所以采取最后一个例子:
class UnknownForm(forms.Form):
choices = forms.ModelMultipleChoiceField(
choices = queryset_of_valid_choices, # not optional, use .all() if unsure
widget = forms.CheckboxSelectMultiple,
)
Run Code Online (Sandbox Code Playgroud)
我在使用类基本视图并遍历Django HTML模板中的未知大小列表时遇到了相同的问题。
该解决方案使用“ post”并为我工作。我将其放在此处是因为上述解决方案很有用,但并没有为我解决循环问题。
HTML模板:
<form action="" method="post">
{% for item in object_list %}
<input type="checkbox" value="{{item.id}}" name="my_object">
{{ item.name }}
{% endfor %}
<button type="submit" name="delete">Delete</button>
<button type="submit" name="mark_read">Mark read</button>
</form>
Run Code Online (Sandbox Code Playgroud)
形成:
class MyForm(forms.Form):
my_object = forms.MultipleChoiceField(
widget=forms.CheckboxSelectMultiple,
)
Run Code Online (Sandbox Code Playgroud)
在基于类的视图中,使用post函数访问POST数据。这将允许您访问已选中项目,上下文和其他表单数据的列表。
视图:
Class MyView(FormView):
template_name = "myawesometemplate.html"
form_class = MyForm
...
# add your code here
def post(self, request, *args, **kwargs):
...
context = self.get_context_data()
...
if 'delete' in request.POST:
for item in form.POST.getlist('my_object'):
# Delete
if 'mark_read' in request.POST:
for item in form.POST.getlist('my_object'):
# Mark as read
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18960 次 |
| 最近记录: |