Django Сохранение модели с формой + текущие данные пользователя - PullRequest
0 голосов
/ 12 декабря 2018

Я пишу свое первое приложение на Django, и я столкнулся с проблемой.Я пытаюсь сделать систему бронирования.Я пытаюсь сохранить модель бронирования.Он работает просто отлично, пока пользователь вышел из системы.Но как только я нажимаю кнопку «Отправить» во время входа, ничего не происходит.Сайт просто перезагружается.Кто-нибудь может указать, что я делаю не так?Вот мой код модели:

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)

Моя форма:

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'})
        }

И мой взгляд:

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})

1 Ответ

0 голосов
/ 12 декабря 2018

Я предполагаю, что ваша форма по какой-то причине не проверяется, и вам нужно ее перехватить, чтобы узнать, что может быть не так.Таким образом, вы можете обновить свой вид следующим образом:

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})

Обновление

Вам не нужно ставить null true и пусто true в полях модели.Вы можете передавать данные user из вида в форму.и если пользователь аутентифицирован, тогда выталкивают поля, которые не нужны для аутентифицированного пользователя.Вот так:

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

И используйте эту форму так:

form = Booking(request.POST or None, user=request.user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...