简体   繁体   中英

Django Saving A Model With Form + Current User Data

I'm writing my first app in django and i have encountered a problem. I'm trying to make a booking system. I'm trying to save the reservation model. It works just fine while the user is logged out. But once i click submit while logged in nothing really happens. The site simply reloads. Can anyone point out what I'm doing wrong? That's my model code:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    name = models.CharField(max_length = 100)
    surname = models.CharField(max_length = 100)
    phone = models.CharField(max_length = 9)

class Reservation(models.Model):
    reservationID = models.AutoField(primary_key = True)
    name = models.CharField(max_length = 100)
    surname = models.CharField(max_length = 100)
    phone = models.CharField(max_length = 9)
    email = models.EmailField()
    bookIn = models.DateField('Book in date', default = timezone.now)
    bookOut = models.DateField('Book out date', default = timezone.now)
    roomType = models.ForeignKey(Room_type, on_delete = models.CASCADE)

My form:

class Booking(forms.ModelForm):

class Meta:
    model = Reservation
    fields = ('name', 'surname', 'phone', 'email', 'roomType', 'bookIn', 'bookOut',)
    widgets = {
        'bookIn': forms.DateInput(attrs={'class': 'datepicker'}),
        'bookOut': forms.DateInput(attrs={'class': 'datepicker'})
        }

And my view:

form = Booking()
if request.method == 'POST':
    form = Booking(request.POST)
    if form.is_valid():
        if request.user.is_authenticated:
            reservation = Reservation()
            guest = Profile.objects.get(user=request.user)
            reservation.name = guest.name
            reservation.surname = guest.surname
            reservation.phone = guest.phone
            reservation.email = guest.user.email
            reservation.bookIn = form.cleaned_data.get('bookIn')
            reservation.bookOut = form.cleaned_data.get('bookOut')
            reservation.roomType = form.cleaned_data.get('roomType')
            reservation.save()

        else:
            reservation = form.save()
            reservation.save()

        n = reservation.pk
        return redirect('bookSuccess', n)
return render(request, 'hotel/bookRoom.html', {'form' : form})

I am assuming your form is not validating for some reason, and you need to catch it to see what might be going wrong. So you can update your view like this:

form = Booking(request.POST or None)
if request.method == 'POST':
    if form.is_valid():
        if request.user.is_authenticated:
            reservation = form.save(commit=False)
            # optimized the code
            guest = Profile.objects.get(user=request.user)
            reservation.name = guest.name
            reservation.surname = guest.surname
            reservation.phone = guest.phone
            reservation.email = request.user.email
            reservation.save()
        else:
            reservation = form.save()  # removed duplicate save

        n = reservation.pk
        return redirect('bookSuccess', n)
return render(request, 'hotel/bookRoom.html', {'form' : form})

Update

You don't need to put null true and blank true in the model fields. You can pass the user data from view to form. and if the user is authenticated then pop the fields which is not necessary for authenticated user. Like this:

class Booking(forms.ModelForm):

      def __init__(self, *args, **kwargs):
           user = kwargs.pop('user')
           super(Booking, self).__init__(*args, **kwargs)
           if user.is_authenticated:
               self.fields.pop('name')  # or make them required false like this:  self.fields['name'].required = False
               self.fields.pop('surname')
               # other fields unnecessary for authenticated user
      # rest of the code

And use this form in view like this:

form = Booking(request.POST or None, user=request.user)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM