即使在成功创建对象后,django modelformset_factory 仍维持先前提交的数据 [英] django modelformset_factory sustains the previously submitted data even after successfully created the objects

查看:19
本文介绍了即使在成功创建对象后,django modelformset_factory 仍维持先前提交的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using django modelformset_factory in one of my view. I am using javascript for adding new forms to the formset in Template. Everything is working fine but my problem is that when i try to create a new object using modelformset_factory it shows me all the objects as forms which i previously created. Or in simple words it shows me the last submitted forms when i create a new instance using modelformset_factory forms. Like I have defined extra = 0 while initializing the modelformset_factory and from template I added 5 forms to formset and submitted those. Next time when I will re render the template for creating calaendar for another user it show me all the instances which i submitted previously for the previous user. means It iwll show me 5 forms with full data which i submitted for previous user.

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

My model, Formset, Form and View are as follow.

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).我已经从表单中排除了用户字段,因此唯一的表单验证将不起作用.有什么方法可以检查提交的表单集表单的唯一日期.

and my Next question is I want unique_together = (user, date). I have excluded the user field from forms so unique together forms validations will not work. Is there any way to check the unique dates for the submitted formset forms.

推荐答案

第一个问题的答案i.e modelformset_factory总是维持旧数据就在这里.https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#changed-the-queryset正如文档中给出的那样,通过覆盖 basemodelformset 的构造函数来改变查询集

Answer of the first question i.e modelformset_factory always sustains the old data is lies here. https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#changing-the-queryset as it is given in the docs chenge the queryset by overriding the constructor of the basemodelformset

from django.forms.models import BaseModelFormSet

从 myapp.models 导入作者

from myapp.models import Author

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

它将解决问题 1.

这篇关于即使在成功创建对象后,django modelformset_factory 仍维持先前提交的数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆