【问题标题】:django modelformset_factory sustains the previously submitted data even after successfully created the objects即使在成功创建对象后,django modelformset_factory 也会保留先前提交的数据
【发布时间】:2015-06-10 22:30:38
【问题描述】:

在我的一个观点中,我正在使用 django modelformset_factory。我正在使用 javascript 向模板中的表单集添加新表单。一切正常,但我的问题是,当我尝试使用 modelformset_factory 创建一个新对象时,它会将所有对象显示为我之前创建的表单。或者简单地说,当我使用 modelformset_factory 表单创建一个新实例时,它会向我显示最后提交的表单。就像我在初始化 modelformset_factory 时定义了 extra = 0 一样,我从模板中添加了 5 个表单到 formset 并提交了这些表单。下次我将重新渲染为另一个用户创建日历的模板时,它会显示我之前为前一个用户提交的所有实例。意味着它会向我展示我为之前的用户提交的包含完整数据的 5 个表单。

我的模型、Formset、Form 和 View 如下。

class Calendar(models.Model):
    user = models.ForeignKey(User)
    name = models.CharField(max_length=200, null=True, blank=True)
    date = models.DateField(verbose_name=_('Date'))

    def __unicode__(self):
        return self.name

class UserCalendar(forms.ModelForm):
    date =forms.DateField(input_formats=['%d-%m-%Y', '%d-%m-%y'])
    class Meta:
        model = ProviderCalendar 
        exclude = ('user',)


class CalendarFormset(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(CalendarFormset, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False

    def clean(self):
        return super(CalendarFormset, self).clean()

class CreateCalendar(LoginRequiredMixin,DetailView):
    model = Profile
    template_name = 'calendar_create.html'
    formset = modelformset_factory(Calendar,
      form=CalendarForm,
    formset=CalendarFormset,
    extra=0,
    )

def get(self, request, *args, **kwargs):
    self.object = self.get_object()
    context = super(CreateCalendar, self).get_context_data(**kwargs)
    context['formset'] = self.formset
    return self.render_to_response(context)

def post(self, request, *args, **kwargs):
    formset = self.formset(request.POST)
    self.object = self.get_object()
    if formset.is_valid():
        for form in formset.save(commit=False):
            form.user = self.get_object().user
            form.save()
        messages.success(request, _('Calendar created successfully'))
        return redirect("detail_profile")
    else:
        return self.render_to_response(self.get_context_data(formset=formset))

我的下一个问题是我想要 unique_together = (user, date)。我已经从表单中排除了用户字段,因此表单验证将不起作用。有没有办法检查提交的表单集表单的唯一日期。

【问题讨论】:

    标签: django django-models django-forms django-views modelform


    【解决方案1】:

    第一个问题i.e modelformset_factory always sustains the old data的答案就在这里。 https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#changing-the-queryset 正如文档中给出的那样,通过覆盖 basemodelformset 的构造函数来实现查询集

    from django.forms.models import BaseModelFormSet
    

    从 myapp.models 导入作者

    class CalendarFormset(BaseModelFormSet):
        def __init__(self, *args, **kwargs):
            super(CalendarFormset, self).__init__(*args, **kwargs)
            self.queryset = Calendar.objects.none()
    

    它会解决问题1。

    【讨论】:

      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 2011-05-21
      • 2016-12-11
      • 1970-01-01
      相关资源
      最近更新 更多