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)