[英]Adding Validation to Django Inlineformset Causing Metaclass Conflict
我正在嘗試向我的Django表單添加驗證。
我想要至少一個子模型用於我的inlineformset。
我將以下內容用作參考: Django中的內聯表單驗證
我仍然遇到錯誤
線454,在formset_factory返回類型(表格名 + STR(“表單集”),(表單集,),ATTRS。)類型錯誤:元類沖突:一個派生類的元類必須的元類的一個(非嚴格)的子類所有基地
from django.forms import inlineformset_factory
from .models import *
from django.forms.models import BaseInlineFormSet
from django import forms
class PropertyForm(forms.ModelForm):
class Meta:
model = Property
exclude = ()
class UnitForm(forms.ModelForm):
class Meta:
model = Unit
exclude = ()
class CustomUnitFormset(BaseInlineFormSet):
def is_valid(self):
return super(CustomUnitFormset, self).is_valid() and \
not any([bool(e) for e in self.errors])
def clean(self):
# get forms that actually have valid data
count = 0
for form in self.forms:
try:
if form.cleaned_data and not form.cleaned_data.get('DELETE', False):
count += 1
except AttributeError:
pass
if count < 1:
raise forms.ValidationError('You must have at least one unit')
UnitFormSet = inlineformset_factory(Property, Unit, form=PropertyForm,
formset='CustomUnitFormset',
extra=0,
min_num=1,
validate_min=True,
validate_max=True,
max_num=10,
)
view.py
class PropertyUnitCreate(LoginRequiredMixin, CreateView):
model = Property
fields = ['address']
success_url = reverse_lazy('property-list')
def get_context_data(self, **kwargs):
data = super(PropertyUnitCreate, self).get_context_data(**kwargs)
if self.request.POST:
data['units'] = UnitFormSet(self.request.POST)
else:
data['units'] = UnitFormSet()
return data
def form_valid(self, form):
context = self.get_context_data()
units = context['units']
form.instance.user = self.request.user
with transaction.atomic():
self.object = form.save()
if units.is_valid():
units.instance = self.object
units.save()
return super(PropertyUnitCreate, self).form_valid(form)
我也試圖理解這里解釋的繼承問題: 三重繼承會導致元類沖突...有時
我的視圖邏輯來自https://medium.com/@adandan01/django-inline-formsets-example-mybook-420cc4b6225d
但是我看不到我有一個類繼承自兩個類,這會導致此錯誤。 如果我刪除“ formset ='CustomUnitFormset',“,一切正常
有人可以解釋錯誤的原因,以及如何防止這種情況嗎? 我可以更好地管理forms.py文件嗎?
您需要將實際的表單集類而不是字符串傳遞給工廠。
UnitFormSet = inlineformset_factory(Property, Unit, form=PropertyForm,
formset=CustomUnitFormset, ...)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.