python - Django-无法分配查询集必须是实例
问题描述
我正在尝试制作多项选择表单,但出现错误:无法分配“<QuerySet [<Session: bbbb>, <Session: jheeyyy>]>”:“Booking.session”必须是“Session”实例. 我在stackoverflow中检查了一些解决方案,但我无法解决。我试图将 ModelMultipleChoiceField 更改为 ModelChoiceField 但它给出了“选择一个有效的选择。该选择不是可用选择错误之一。” 当我这样做的时候。我需要帮助。
模型.py
class Booking(models.Model):
"""
Entry recording a user registration to an event
"""
event = models.ForeignKey(
"Event", related_name="bookings", on_delete=models.CASCADE
)
person = models.ForeignKey(
settings.AUTH_USER_MODEL, related_name="bookings", on_delete=models.CASCADE
)
session = models.ForeignKey(
"Session",
related_name="bookings",
null=True,
blank=True,
on_delete=models.SET_NULL,
)
class Meta:
unique_together = ("event", "person")
ordering = ["id"]
def __unicode__(self):
return "{0} : {1}".format(self.event.title, self.person)
表格.py
class SessionChoiceField(forms.ModelMultipleChoiceField):
def label_from_instance(self, obj):
return obj.get_label()
class BookingSessionForm(ModelForm):
session = SessionChoiceField(
label="Select your session", queryset=None, required=True, widget = forms.CheckboxSelectMultiple, to_field_name = "title",
)
class Meta:
model = Booking
fields = ["session"]
def __init__(self, target_url, *args, **kwargs):
super(BookingSessionForm, self).__init__(*args, **kwargs)
self.fields["session"].queryset = self.instance.event.sessions.all()
self.helper = FormHelper()
self.helper.form_method = "post"
self.helper.form_action = reverse(
target_url, kwargs={"booking_id": self.instance.id}
)
self.helper.layout = Layout(
"session",
FormActions(
Submit("save", "Confirm", css_class="btn btn-success"),
Reset("reset", "Reset", css_class="btn btn-warning"),
),
)
视图.py
def _booking_update_session(request, booking, form_target_url):
"""
Handle the form to select the session for a booking
"""
session_form = BookingSessionForm(
form_target_url, request.POST or None, instance=booking
)
if session_form.is_valid():
if booking.is_cancelled() and booking.event.is_fully_booked():
messages.error(request, "Sorry the event is fully booked already")
return redirect("index")
# Check for a fully booked session
session = session_form.cleaned_data["session"]
if session.is_fully_booked() and (
booking.is_cancelled or booking.session.id != session.id
):
messages.error(
request, 'Sorry, session "{0}" is fully booked'.format(session.title)
)
return redirect(form_target_url, booking_id=booking.id)
session_form.save()
booking.confirmedOn = timezone.now()
booking.cancelledBy = None
booking.cancelledOn = None
booking.save()
if booking.event.choices.count() > 0:
messages.warning(
request, "Session confirmed, please validate your choices."
)
return redirect("booking_update", booking_id=booking.id)
else:
return _booking_update_finished_redirect(request, booking, "Session")
else:
context = {"booking": booking, "session_form": session_form}
return render(request, "oneevent/booking_update_with_sessions.html", context)