【发布时间】:2018-07-25 14:51:38
【问题描述】:
我正在尝试从用户可以为组权限选择多个选项的模型表单中检索数据;为此,我使用的是多对多关系。
表格的结构如下:
class GroupForm(ModelForm):
class Meta:
model = Gruppo
fields = ("nome", "Autorizzazioni")
def __init__(self, *args, **kwargs):
super(GroupForm, self).__init__(*args, **kwargs)
self.fields["Autorizzazioni"].widget = CheckboxSelectMultiple()
self.fields["Autorizzazioni"].queryset = Permesso.objects.all()
self.fields["Autorizzazioni"].required = False
名为 Autorizzazioni 的字段与 Permesso 模型具有多对多关系。问题是,由于我手动写出表单(boss'choice),表单检索到的查询集是空的(尽管 id 设置正确)
这意味着用户所做的任何选择都不会被保存,并且已经选择的选择不再被保存。我使用了一个简单的 form.save(),根据文档,它还应该保存 m2m 关系。
你们能帮帮我吗?
编辑:
这是视图:
def gruppo_detail(request, id=None):
if not request.user.is_authenticated or not can_view(request):
return redirect("/")
instance = get_object_or_404(Gruppo, id=id)
permessi = Permesso.objects.all()
if request.method == "POST":
form = GroupForm(request.POST, instance=instance)
if form.is_valid():
form.save()
action.send(request.user, verb="ha modificato il gruppo", target=instance, ip=get_ip(request))
return redirect("/gruppi/")
else:
form = GroupForm(instance=instance)
这是模板:
<form class="m-form m-form--fit m-form--label-align-right" method="POST" action="{{request.path}}" enctype="multipart/form-data">
{% csrf_token %}
<!-- begin:: Portlet Body-->
<div class="m-portlet__body">
<div class="form-group m-form__group row">
{{form.nome.errors}}
<label for="id_nome" class="col-lg-2 col-form-label"><span class="m--font-danger" aria-required="true">* </span> Nome</label>
<div class="col-lg-4">
<input type="text" class="form-control m-input" name="nome" value="{{gruppo.nome}}" id="id_nome" required>
</div>
</div>
<div class="form-group m-form__group row">
<label for="id_Autorizzazioni" class="col-lg-2 col-form-label">Autorizzazioni</label>
<div class="col-lg-10">
<div class="m-checkbox-list">
{% for permesso in permessi %}
<label class="m-checkbox">
{% is_present permesso gruppo.Autorizzazioni.all as checked %}
<input type="checkbox" id="id_Autorizzazioni_{{permesso.id}}" value="{{permesso.id}}" {% if checked %} checked {% endif %}>{{permesso.nome}}
<span></span>
</label>
{% endfor %}
</div>
</div>
</div>
</div>
{% include '_bottom_add.html' %}
</form>
谢谢
【问题讨论】:
-
你需要展示模板和视图。
-
抱歉,我马上添加
标签: django django-models django-forms django-templates