Django Form, MultipleChoiceField и круговой импорт

Я пытаюсь настроить ModelForm Formset - с полями Checkbox...

Но если я устанавливаю queryset для моего MultipleChoiceField, я получаю "ImportError"

ImportError: cannot import name 'Event' from partially initialized module 'ferienspiel.event.models' (most likely due to a circular import)

Как я могу сделать queryset для моих MultipleChoiceField-Fields в `forms.py? чтобы избежать ошибки циклического импорта?

Моя установка:

- app
--- model.py (contains Model and Formhandler, for Wagtail Page `def serve()` )
--- form.py (formset setup)
--- ulrs.py
--- views.py

forms.py

class ChildForm(ModelForm):

    def __init__(self, *args, **kwargs):

        super(ChildForm, self).__init__(*args, **kwargs)

        self.fields["event"].widget = CheckboxSelectMultiple()
        self.fields["event"].queryset = Event.objects.all().order_by("date", "time")

    class Meta:
        model = Child
        fields = ("first_name", "last_name", "date_of_birth", "text")
        widgets = {
       ...
       ...

model.py

class Event(Page):
    location = models.TextField(max_length=500, null=False)
    date = models.DateField(null=False)
    time = models.TimeField(null=False)


class EventRegistrationPage(Page):
    intro = models.TextField(blank=True)

    def serve(self, request):
        if request.method == "POST":
            parent_form = ParentForm(request.POST, request.FILES)
            childs_form = ChildFormSet(request.POST, request.FILES)

            if all([parent_form.is_valid(), childs_form.is_valid()]):
                for child in childs_form:
                    # print(f"child {child.cleaned_data}")
                    if child.is_valid():
                        new_child = child.save(commit=False)
                        new_child.parent = new_parent
                        new_child.save()
                        new_child.event.set(
                            child.cleaned_data.get("event")
                        )
                        child.save_m2m()
                        childs_data.append(new_child)

В основном, круговой импорт является результатом плохого дизайна, вам следует найти лучший метод, но если вы хотите придерживаться этого, вы можете сделать это следующим образом:-

from . import forms # if the form is not in same app change . to the app_name

parent_form = forms.ParentForm(request.POST, request.FILES)
childs_form = forms.ChildFormSet(request.POST, request.FILES)

forms.py

from . import models

self.fields["event"].queryset = models.Event.objects.all().order_by("date", "time")

Это должно решить проблему кругового импорта

Переместите строку import, импортирующую модуль forms, в тело метода serve. Таким образом, импортировать этот модуль придется только при выполнении метода serve, а не при запуске:

class EventRegistrationPage(Page):
    intro = models.TextField(blank=True)

    def serve(self, request):
        from ferienspiel.events.forms import ParentForm, ChildFormSet

        if request.method == "POST":
            parent_form = ParentForm(request.POST, request.FILES)
            childs_form = ChildFormSet(request.POST, request.FILES)
Вернуться на верх