簡體   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