繁体   English   中英

使用Django CreateView来处理formset - 它没有验证

[英]Using Django CreateView to handle formset - It doesnt validate

问题

我正在尝试修改基于类的视图'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变量说每个字段都是必需的,我认为它需要一个常规表单而不是一个formset - >我缺少一些选项告诉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

但它没有任何区别。

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相同,但对于formsets。

Django进入form_invalid()并且form.errors对长度和名称字段说“此字段是必需的”。

这是正常的,并且由于所需的字段paramatere

默认情况下,每个Field类都假定该值是必需的,因此如果传递一个空值 - None或空字符串(“”) - 那么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)

我错过了什么让它确实正确验证

您是否尝试发布名称长度值的表单?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM