Django-无法分配查询集必须是一个实例

时间:2021-06-05 23:17:55

标签: python django

我正在尝试制作多项选择表,但出现错误:无法分配“, ]>”:“Booking.session”必须是“会话”实例。我在 stackoverflow 中检查了一些解决方案,但我无法解决。我试图改变 ModelMultipleChoiceField 作为 ModelChoiceField 但它给出了“选择一个有效的选择。该选择不是可用选择错误之一。”当我这样做时。我需要帮助。

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

forms.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"),
            ),
        )

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

0 个答案:

没有答案
相关问题