私は django を初めて使用します (今までは、symfony PHP フレームワークを使用していました)。私の問題は次のとおりです。モデル Event とモデル Date があります。Date には Event への外部キーがあるため、Event は 1 つ以上の Date を持つことができます (または持つ必要があります)。
ここで、イベントを作成するためのフォームが必要です。このフォームには、対応する日付を 1 つ追加するためのサブフォームが含まれている必要があります (イベントに複数の日付がある場合は、後で日付を追加する必要があります)。
inlineformset を使用して日付サブフォームを実現しましたが、日付が入力されていない場合、エラーは発生せず、イベントは日付なしで保存されます。私が望むのは、この inlineformset を必須にするか、少なくとも 1 つの inlineformset が必要であると言うだけです。
これらの質問を見つけましたが、どの回答も役に立ちませんでした:
ヒントはありますか?
編集:バックエンドではなく、フロントエンドにこれが必要です。最初のリンクは、管理者バックエンドについて説明しています。
EDIT2:いくつかのソースコードが追加されました
MandatoryInlineFormSet.py:
from django.forms.models import BaseInlineFormSet
from django import forms
class MandatoryInlineFormSet(BaseInlineFormSet):
def clean(self):
# get forms that actually have valid data
count = 0
for form in self.forms:
try:
if form.cleaned_data:
count += 1
except AttributeError:
# annoyingly, if a subform is invalid Django explicity raises
# an AttributeError for cleaned_data
pass
if count < 1:
raise forms.ValidationError('You must have at least one order')
イベント.py:
from [...]
def new(request):
DateFormset = inlineformset_factory(
Event,
Date,
can_delete=False,
extra=1,
max_num=1,
formset=MandatoryInlineFormSet,
)
if request.POST:
form = EventForm(request.POST)
date_formset = DateFormset(request.POST)
if form.is_valid():
event = form.save(commit=False)
date_formset = DateFormset(request.POST, instance=event)
if date_formset.is_valid():
event.save()
date_formset.save()
return HttpResponseRedirect(reverse('frontpage'))
else:
form = EventForm()
date_formset = DateFormset()
return render_to_response('event/new.html', {
'form': form,
'date_formset': date_formset,
}, context_instance=RequestContext(request))
イベント/new.html:
[...]
<form action="{% url new-event %}" method="post">
{% csrf_token %}
{{ form.as_p }}
{{ date_formset.management_form }}
{% for date_form in date_formset.forms %}
{{ date_form.as_p }}
{% endfor %}
<input type="submit" value="{% trans "Create event" %}"/>
</form>
[...]
宜しくお願いします