3

私は 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>
[...]

宜しくお願いします

4

1 に答える 1

1

私はほとんど偶然にこれにつまずいたことがあります。モデル選択フィールドを持つインラインフォームセットがありました。そのモデル選択には empty_label がありませんでした。したがって、技術的には完全に空白ではありませんでした。インライン フォームで他のフィールドが省略されている場合、検証エラーが表示されます (これはビューで簡単にテストでき、すべてのインライン フォームが有効でない限り、メイン フォームは保存されません)。

したがって、2 つのオプションが残っているようです: 1) 日付フォームに無効なテキスト (つまり、日付ではなく、ある種の「ヘルパー」テキスト) を入力して、そこに残して送信すると検証に失敗するか、2) やり直す空白の状態のないドロップダウン ウィジェットへの日付セレクター - したがって、ユーザーに何かを選択するように強制します (ただし、複数のドロップダウンが面倒になる適切な JavaScript 日付ウィジェットを好む場合があります。

于 2011-01-06T01:59:05.750 に答える