Как отслеживать url в формах Django
Есть сайт на Django для бронирования номеров в разных отелях (13 штук- 13 страниц), данные из заполненной формы записываются в БД. Ничего лучше не придумал как создать 13 одинаковых таблиц с разными названиями для каждого отеля. Но это сильно противоречит принципу DRY. Поэтому вопрос - как можно отследить url с которого передаётся форма и автоматически заполнять ячейку названием отеля в БД.
class ReceptionAlexander(models.Model):
date_first = models.DateField(verbose_name='Дата заезда')
date_second = models.DateField(verbose_name='Дата выезда')
rooms = models.IntegerField(verbose_name='Количество номеров', default=1)
adult = models.IntegerField(verbose_name='Количество взрослых гостей', default=1)
kids = models.IntegerField(verbose_name='Количество детей', default=0)
name = models.CharField(verbose_name='ФИО', max_length=40)
phone = models.CharField(verbose_name='Номер телефона', max_length=12)
class Meta:
verbose_name_plural = 'Александр Хаус'
class ReceptionGalunov(models.Model):
date_first = models.DateField(verbose_name='Дата заезда')
date_second = models.DateField(verbose_name='Дата выезда')
rooms = models.IntegerField(verbose_name='Количество номеров', default=1)
adult = models.IntegerField(verbose_name='Количество взрослых гостей', default=1)
kids = models.IntegerField(verbose_name='Количество детей', default=0)
name = models.CharField(verbose_name='ФИО', max_length=40)
phone = models.CharField(verbose_name='Номер телефона', max_length=12)
class Meta:
verbose_name_plural = 'Галунов Отель'
class ReceptionGelvecia(models.Model):
date_first = models.DateField(verbose_name='Дата заезда')
date_second = models.DateField(verbose_name='Дата выезда')
rooms = models.IntegerField(verbose_name='Количество номеров', default=1)
adult = models.IntegerField(verbose_name='Количество взрослых гостей', default=1)
kids = models.IntegerField(verbose_name='Количество детей', default=0)
name = models.CharField(verbose_name='ФИО', max_length=40)
phone = models.CharField(verbose_name='Номер телефона', max_length=12)
class Meta:
verbose_name_plural = 'Отель Гельвеция'
Форма
class ReceptionFormGelvecia(forms.ModelForm):
class Meta:
model = ReceptionGelvecia
fields = ['date_first', 'date_second', 'rooms', 'adult', 'kids', 'name', 'phone']
И так далее к каждой таблице
Ответы (2 шт):
Воспользуйтесь URL dispatcher
from django.urls import path
from . import views
urlpatterns = [
path('Reception', views.receptions)
]
Вам нужно пересмотреть архитектуру ваших модейлей. Создайте две зависимые таблицы.
Создаёте модель Hotel в которой у Вас будет хранится все отели , его название и месторасположение (для примера).
class Hotel(models.Model):
title = models.CharField(max_length=255, blank=False, null=False)
location = models.CharField(max_length=255, blank=False, null=False)
def __str__(self):
return self.title
После чего создаёте модель под бронирование.
class ReceptionAlexander(models.Model):
hotel_name = models.ForeignKey(Hotel, related_name='h_name', blank=False, null=False)
date_first = models.DateField(verbose_name='Дата заезда')
date_second = models.DateField(verbose_name='Дата выезда')
rooms = models.IntegerField(verbose_name='Количество номеров', default=1)
adult = models.IntegerField(verbose_name='Количество взрослых гостей', default=1)
kids = models.IntegerField(verbose_name='Количество детей', default=0)
name = models.CharField(verbose_name='ФИО', max_length=40)
phone = models.CharField(verbose_name='Номер телефона', max_length=12)
def __str__(self):
return ' | '.join([self.hotel_name, self.name])
И получится следующее, в поле hotel_name у вас будет перечень всех созданных отелей. Через Django Forms создаете выпадающий список для поля hotel_name на основе таблицы Hotel. По итогу у Вас будет 2 model, 1 forma и 1 url.
Либо создаёте одну модель
class ReceptionAlexander(models.Model):
hotel_name = models.CharField(max_length=255, blank=False, null=False)
date_first = models.DateField(verbose_name='Дата заезда')
date_second = models.DateField(verbose_name='Дата выезда')
rooms = models.IntegerField(verbose_name='Количество номеров', default=1)
adult = models.IntegerField(verbose_name='Количество взрослых гостей', default=1)
kids = models.IntegerField(verbose_name='Количество детей', default=0)
name = models.CharField(verbose_name='ФИО', max_length=40)
phone = models.CharField(verbose_name='Номер телефона', max_length=12)
def __str__(self):
return ' | '.join([self.hotel_name, self.name])
И после чего в django forms создаёте под поле hotel_name выпадающий список.
Hotels =(
("1", "Редисон"),
("2", "Хаятт"),
("3", "Континенталь"),
("4", "Четыре сизона"),
)
# creating a form
class HotelForm(forms.Form):
hotel_name = forms.ChoiceField(choices = Hotels)