当我输入custom_form.tickets.value
并且数据库中已经保存了一些信息(ManytoMany)时,例如`[19,22,20]``
数据库条目已正确保存,并且在页面加载时,所有保存的字段均已填写。但是,由于它是形式,因此可能会发生输入错误。
我希望我的表单在单击“提交”之前显示/保存先前选择的复选框。但是,然后不检查所有字段。仅当我将其更改为{% if ticket_id|stringformat:"s" in custom_form.tickets.value %}checked{% endif %}>
并因此添加|stringformat:"s"
时,它才适用于post方法。不幸的是,我然后遇到了一个问题,即实例/数据库记录未显示。
您知道我如何使这两种情况都能起作用吗?在加载页面和插入实例数据时,或者在提交表单(如果发生错误)时。
<div class="form-group">
<label for="{{ custom_form.tickets.id_for_label }}">
{{ custom_form.tickets.label }}
<span class="badge badge-light">{% trans "Optional" %}</span>
</label>
<small class="form-text text-muted mt--2">{{ custom_form.tickets.help_text }}</small>
{% for ticket_id, ticket_label in custom_form.tickets.field.choices %}
<div class="custom-control custom-checkbox">
<input
type="checkbox"
name="{{ custom_form.tickets.html_name }}"
value={{ ticket_id }}
class="custom-control-input"
id="id_{{ custom_form.tickets.html_name }}_{{ forloop.counter }}"
{% if ticket_id in custom_form.tickets.value %}checked{% endif %}>
<label class="custom-control-label" for="id_{{ custom_form.tickets.html_name }}_{{ forloop.counter }}">{{ ticket_label }}</label>
</div>
{% endfor %}
{% if custom_form.tickets.errors %}
<div class="invalid-feedback d-block">
{{ custom_form.tickets.errors|first }}
</div>
{% endif %}
</div>
views.py
class Preferences(AdminPermissionRequiredMixin, AdminBaseView, TemplateView):
"""
This view will show the ambassador preferences
"""
template_name = 'preferences.html'
success_message = _("Settings have been successfully created.")
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['plg_form'] = self.plg_form
context['plg_discount_form'] = self.plg_discount_form
return context
@cached_property
def plg_form(self):
return PLGForm(
instance=self.request.event.event_extension,
data=self.request.POST or None,
)
@cached_property
def plg_discount_form(self):
self.plg_discount = PLGDiscount.objects.filter(event=self.request.event).first()
return PLGDiscountForm(
event=self.request.event,
instance=self.plg_discount,
data=self.request.POST or None,
)
@transaction.atomic
def post(self, request, *args, **kwargs):
if self.plg_form.is_valid() and self.plg_discount_form.is_valid():
incentive = self.plg_form.cleaned_data.get('incentive')
if incentive == plg.Incentive.DISCOUNT:
plg_discount = self.plg_discount_form.save(commit=False)
plg_discount.event = self.request.event
plg_discount.save()
self.social_ticketing_discount_form.save_m2m()
# save forms
self.plg_form.save()
return redirect(
'plg:admin:preferences',
self.request.organizer.slug,
self.request.event.slug,
)
return super().get(request, *args, **kwargs)
forms.py