首页 > 解决方案 > 根据主表单中的值允许的内联表单集的条件数量

问题描述

这是我的models.py

class Event(models.Model):

    EV_TYPE = (
        ('performance', 'performance'),
        ('recording release', 'recording release'),
        ('other', 'other'),
    )
    title = models.CharField(max_length=200)
    type = models.CharField(max_length=20, choices=EV_TYPE, default="performance")


class dateEvent(models.Model):

    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    start_date_time = models.DateTimeField(auto_now=False, auto_now_add=False)

视图.py:

def event_edit_view(request, id):
    event = get_object_or_404(Event, id=id)
    form_event = EventForm(request.POST or None, instance=event)
    DateEventFormSet = inlineformset_factory(Event, dateEvent, extra=5, can_delete=True, fields=('event', 'start_date_time',),
    form_date_event = DateEventFormSet(request.POST or None, instance=Event.objects.get(id=id), queryset=dateEvent.objects.filter(event__id=id))

    context = {
        'event': event,
        'id': event.id,
        'form_event': form_event,
        'form_date_event': form_date_event,

        }

    if request.method == "POST":

        if form_event.is_valid():
            
                form_event.save()
                form_date_event.save()
                return redirect('my-events')
            else:
                raise forms.ValidationError(form_date_event.errors)

        else:
            raise forms.ValidationError([form_event.errors, form_date_event.errors])

    return render(request, "events/event-edit.html", context)

我想让我的事件表单在 event 时要求并接受一个或多个 dateevent 内联表单集,如果是则不type = 'performance'接受type = 'other',并且在 event 时要求一个且仅一个 dateevent 内联表单集type = 'recording release'

这是第一次尝试。这会是一个好的解决方案吗?

if form_date_event.is_valid():
                flag=False
                evt_type = form_event.cleaned_data.get('type')
                if evt_type =="recording release" and form_date_event.lenght != 1:
                    flag = True
                    break
                elif evt_type =="performance" and form_date_event.lenght < 1:
                    flag = True
                    break
                if flag:
                    messages.error(request,'There must be one date event')
                    return render(request, "events/event-edit.html", context)
                else:
                    form_event.save()
                    form_date_event.save()
                    return redirect('my-events')

标签: djangodjango-formsinline-formset

解决方案


推荐阅读