Django:POST请求为字符串,而实例为int

时间:2019-01-17 23:28:45

标签: python django

当我输入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

0 个答案:

没有答案