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

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

问题描述

我在我的观点之一使用django modelformset_factory。我正在使用JavaScript将新表单添加到模板中的表单集。一切正常工作,但我的问题是,当我尝试使用modelformset_factory创建一个新对象时,它会将所有对象显示为以前创建的表单。或者简单来说,当我使用modelformset_factory表单创建一个新的实例时,它会显示最后提交的表单。像我已经定义了 extra = 0 而初始化modelformset_factory和从模板我添加了5个表单到formset并提交。下一次当我将重新渲染为其他用户创建calaendar的模板时,它会显示我之前为先前用户提交的所有实例。意味着我会向我显示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) b $ b 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 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)
上下文['formset'] = self.formset
返回self.render_to_response(上下文)

def post(self,request,* args,** kwargs):
formset = self.formset(request.POST)
self.object = self.get_object()
如果formset.is_valid():
for 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 =(用户,日期)。我从表单中排除了用户字段,因此唯一的表单验证将无法正常工作。有没有办法检查提交的表单表单的唯一日期。

解决方案

第一个问题的答案 ie modelformset_factory始终维持旧数据在这里。
https://docs.djangoproject。 com / en / 1.8 / topics / forms / modelforms /#changing-the-queryset
,因为它在文档中给出了通过覆盖basemodelformset的构造函数来查询查询集

  from django.forms.models import BaseModelFormSet 


$ b $来自myapp.models import的b

作者

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

它将解决问题1。


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.

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))

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.

解决方案

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

from myapp.models import Author

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

It will solve the problem 1.

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

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