Make inlineformset in django necessary

I am new to django (so far I have used the Symfony PHP Framework). My problem is this: I have an Event model and model Date. A date has a foreign key for an event, so an event can (or should) have one or more dates.

Now I want to have a form for creating events, and this form should include a subform for adding one corresponding date (additional dates should be added later if the event has more than one date).

I used inlineformset to implement the Date subform, but if no date is entered, an error does not occur and the event is saved without a Date. All I want to do is make this built-in template necessary or say that the lease (and only) should have one built-in format.

I found these questions, but none of the answers helped me:

Any clues for me?

EDIT: I need this for an interface, not a backend. The first link covers it for the admin backend.

EDIT2: some source code added

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')

event.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))

Event / 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>
[...]

Regards, sewid

+3
source share
1 answer

. , modelchoicefield. modelchoice empty_label. . , ( , ).

, , : 1) ( - "" ), , , , 2) , , - ( javascript, .

+1

Source: https://habr.com/ru/post/1768881/


All Articles