我在我的一个视图中使用django modelformset_factory。我正在使用javascript将新表单添加到Template中的formset。一切都运行正常,但我的问题是,当我尝试使用modelformset_factory创建一个新对象时,它会将所有对象显示为我之前创建的表单。或者简单地说,当我使用modelformset_factory表单创建一个新实例时,它会向我显示最后提交的表单。就像我在初始化modelformset_factory时定义extra = 0
一样,我从模板中添加了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):
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 =(用户,日期)。我已经从表单中排除了用户字段,这样唯一的表单验证将无法正常工作。有没有办法检查提交的formset表单的唯一日期。
答案 0 :(得分:7)
第一个问题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.