Форма 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 theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.
Note: You can limit views to a view to authenticated users with the
@login_required
decorator [Django-doc].