Форма Django никогда не является валидной и поэтому не сохраняется в базе данных

Я создаю модель регистрации, в которой есть дата, время (поле с символами выбора), клиент и ресторан. Мне нужна помощь, почему мой экземпляр не сохраняется, даже когда я заполняю форму модели

models.py

class reservation(models.Model):
    TIMESLOTS = [
        ('11:00-1:00', '11:00-1:00'),
        ('01:00-3:00', '01:00-03:00'),
        ('03:00-05:00', '03:00-05:00'),
        ('05:00-07:00', '05:00-07:00'),
        ('07:00-09:00', '07:00-09:00')
    ]

    date=models.DateField(null=True)
    time=models.CharField(null=True,max_length=200,choices=TIMESLOTS)
    customer=models.OneToOneField(User,null=True,on_delete=models.CASCADE)
    restaurant=models.OneToOneField(Restaurantdetails,on_delete=models.CASCADE,null=True)

    def __str__(self):
        return self.restaurant.name

forms.py

class Reservationform(ModelForm):

    class Meta:

        model=reservation
        fields=['date','time','restaurant']

views.py

def reservationcreator(request):
    form=Reservationform()

    if form.is_valid():
        form = Reservationform(request.POST)

        res=form.save()
        res.customer=request.user
        res.save()
        messages.success(request, 'reservation created')
        return redirect('menu')
    else:
        print('BS')
    context = {'form': form}

    return render(request,'userrestaurant/reservation.html',context)

Ваша форма никогда не будет валидной, потому что вы предоставляете пустую форму. Вам необходимо добавить request.POST данные в эту форму перед ее валидацией:

def reservationcreator(request):
    form=Reservationform(request.POST or None)

    if form.is_valid():
        res.customer=request.user
        res=form.save()
        messages.success(request, 'reservation created')
        return redirect('menu')
    else:
        print('BS')
    context = {'form': form}

    return render(request,'userrestaurant/reservation.html',context)

Форма, которая не ограничена, является никогда действительной. Форма ограниченная - это форма, которая получила данные, например, через request.POST или request.GET; и request.FILES. Таким образом, вы проверяете метод HTTP, и в зависимости от этого инициализируете форму, так:

def reservationcreator(request):
    if request.method == 'POST':
        form = Reservationform(request.POST, request.FILES)
        if form.is_valid():
            form.instance.customer = request.user
            form.save()
            messages.success(request, 'reservation created')
            return redirect('menu')
    else:
        form = ReservationForm()
    context = {'form': form}
    return render(request, 'userrestaurant/reservation.html', context)

При этом ваше представление является простым CreateView [Django-doc] и может быть реализовано с помощью:

from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.messages.views import SuccessMessageMixin
from django.urls import reverse
from django.views.generic import CreateView

class ReservationCreateView(LoginRequiredMixin, SuccessMessageMixin, CreateView):
    form_class = ReservationForm
    template_name = 'userrestaurant/reservation.html'
    success_url = reverse('menu')
    success_message = 'reservation created'

    def form_valid(self, form):
        form.instance.customer = request.user
        return super().form_valid(form)

Note: It is normally better to make use of the settings.AUTH_USER_MODEL [Django-doc] to refer to the user model, than to use the User model [Django-doc] directly. For more information you can see the referencing the User model section of the documentation.


Note: You can limit views to a view to authenticated users with the @login_required decorator [Django-doc].

Вернуться на верх