Question:
How can I retrieve all customers' bookings by their username/ID?

Problem:

I am trying to retrieve all bookings made by the logged-in user. I am getting the following error: Cannot assign "'Leonie": "Customer.user" must be a "User" instance. What I don't understand is how this is not an instance of the user model.


Views.py


from django.shortcuts import render, get_object_or_404

from .forms import CustomerForm, BookingForm

from django.contrib.auth.models import User

from .models import Booking, Customer



# Create your views here.


# https://stackoverflow.com/questions/77218397/how-to-access-instances-of-models-in-view-in-order-to-save-both-forms-at-once?noredirect=1&lq=1

def customer_booking(request):

    if request.method == 'POST':

        customer_form = CustomerForm(request.POST, prefix='customer')

        booking_form = BookingForm(request.POST, prefix='booking')

        if customer_form.is_valid() and booking_form.is_valid():

            customer = customer_form.save(commit=False)

            customer.user = request.user.username

            customer.save()

            booking = booking_form.save(commit=False)

            booking.customer = customer

            booking.save()

            customer_form = CustomerForm()

            booking_form = BookingForm()


    else:

        customer_form = CustomerForm(prefix='customer')

        booking_form = BookingForm(prefix='booking')


    context = {

        'customer_form': customer_form,

        'booking_form': booking_form,

    }


    return render(request, 'booking.html', context)



def display_booking(request):

    bookings = Booking.objects.filter(customer=request.user)

    context = {

        'bookings': bookings,

    }

    return render(request, 'booking.html', context)


models.py

from django.db import models

from django.contrib.auth.models import User


# Create your models here.


BOOKING_STATUS = ((0, 'To be confirmed'), (1, 'Confirmed'), (2, 'Declined'))



class Customer(models.Model):

    first_name = models.CharField(max_length=80)

    last_name = models.CharField(max_length=80)

    email = models.EmailField()

    phone_number = models.CharField(max_length=20)

    user = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):

        return f"{self.user}"



class Booking(models.Model):

    booking_date = models.DateField()

    booking_time = models.TimeField()

    number_attending = models.IntegerField(default=2)

    booking_status = models.IntegerField(choices=BOOKING_STATUS, default=0)

    customer = models.ForeignKey(User, on_delete=models.CASCADE)


    def __str__(self):

        return f"Booking by {self.customer}"


I tried changing the foreign key constraint in the customer model to customer rather than user, however I am still getting the same error message. I'm sure there is a better way to accomplish retrieving all bookings by the user that is logged in.


Solution:

You should use request.user directly to retrieve the user object instead of request.user.username.


Replace:

    customer.user = request.user.username

With:

    customer.user = request.user


Answered by: >zankoAN

Credit: >Stackoverflow


Suggested reads:

>Fix webapp stops working issue in Django- Python webapp

>Creating a form in Django to upload a picture from website

>Sending Audio file from Django to Vue

>How to keep all query parameters intact when changing page in Django?

>Solved: TaskList View in Django



Ritu Singh

Ritu Singh

Submit
0 Answers