我正在尝试修改基于类的视图'CreateView'来处理formset而不是表单。
当客户端执行GET请求时,formset会正确显示给客户端。 问题是当客户端使用POST提交表单时。
当Django收到POST时,它会进入form_invalid(),而form.errors会为长度和名称字段说“此字段是必需的”。
class Service(models.Model):
TIME_CHOICES = (
(15, '15 minutes'),
(30, '30 minutes'),
)
length = models.FloatField(choices=TIME_CHOICES,max_length=6)
name = models.CharField(max_length=40)
class ServiceForm(ModelForm):
class Meta:
model = Service
ServiceFormSet = modelformset_factory(Service,form=ServiceForm)
class ServiceEditView(CreateView):
template_name = "service_formset.html"
model = Service
form_class = ServiceForm
success_url = 'works/'
def form_valid(self, form):
context = self.get_context_data()
formset = context['formset']
if formset.is_valid():
self.object = form.save()
return HttpResponseRedirect('works/')
else:
return HttpResponseRedirect('doesnt-work/')
def form_invalid(self, form):
print form.errors
return HttpResponseRedirect('doesnt-work/')
def get_context_data(self, **kwargs):
context = super(ServiceEditView, self).get_context_data(**kwargs)
if self.request.POST:
context['formset'] = ServiceFormSet(self.request.POST)
else:
context['formset'] = ServiceFormSet(queryset=Service.objects.filter(user__exact=self.request.user.id))
return context
如何使用createview处理formset? 我错过了什么让它确实正确验证?
该教程我从目前为止采用了大部分比特http://haineault.com/blog/155/
由于form.errors变量表示每个字段都是必需的,我认为它期望常规表单不是表单集 - >我错过了一些告诉CreateView它是一个formset的选项。
我也尝试过这里建议的解决方案:http://www.kevinbrolly.com/。
class BaseServiceFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(BaseServiceFormSet, self).__init__(*args, **kwargs)
for form in self.forms:
form.empty_permitted = False
但它没有任何区别。
答案 0 :(得分:9)
pip install django-extra-views
在 view.py :
中from extra_views import FormSetView
class ItemFormSetView(ModelFormSetView):
model = Service
template_name = 'service_formset.html'
有关于将其纳入Django核心的讨论,但讨论似乎停滞不前。 https://code.djangoproject.com/ticket/16256
在此存储库https://github.com/AndrewIngram/django-extra-views 有一个名为ModelFormSetView的视图,它完全符合我的需要。 它是一个基于类的视图,与CreateView相同,但对于表单集。
答案 1 :(得分:0)
Django进入form_invalid()并且form.errors对长度和名称字段说“这个字段是必需的”。
这是正常的,由于required field paramatere:
默认情况下,每个Field类都假定该值是必需的,所以如果你 传递一个空值 - 无或空字符串(“”) - 然后 clean()将引发ValidationError异常:
如果要反转,可以设置 required = False :
class Service(models.Model):
TIME_CHOICES = (
(15, '15 minutes'),
(30, '30 minutes'),
)
length = models.FloatField(choices=TIME_CHOICES,max_length=6, required=False)
name = models.CharField(max_length=40, required=False)
我错过了什么让它确实正确验证
您是否尝试发布名称为且长度值的表单?