[英]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.