我开始用Django建立我的第一个网站。试图为我女朋友的业务(美甲沙龙)创建网站,并有一些问题。第一个问题是预订表格和选择自由时间。设法找到解决方案与2个模型和一对一的关系:
class FreeHoursModel(models.Model):
EARLY = '10:00'
MID = '13:00'
LATE = '16:00'
HOURS = [(x, x) for x in (EARLY, MID, LATE)]
time = models.CharField(
max_length=20,
choices=HOURS,
default=1,
)
date = models.DateField(
)
def __str__(self):
return f"{str(self.date)} - {self.time}"
class Customer(models.Model):
MAX_LENGTH = 25
name = models.CharField(
max_length=MAX_LENGTH,
)
last_name = models.CharField(
max_length=MAX_LENGTH,
)
phone_number = models.IntegerField()
date_of_booking = models.DateField(
auto_now_add=True
)
hours = models.OneToOneField(
FreeHoursModel,
on_delete=models.DO_NOTHING
)
class Meta:
get_latest_by = 'date_of_booking'
第二个问题是如何消除时间。
以下是我的观点:
class IndexView(generic.TemplateView):
template_name = 'landing_page/landing_page.html'
class BookingView(generic.CreateView):
template_name = 'booking_page/booking.html'
success_url = reverse_lazy('summary')
form_class = CustomerForm
def form_valid(self, form):
name = form.cleaned_data['name']
last_name = form.cleaned_data['last_name']
phone_number = form.cleaned_data['phone_number']
hour = str(form.cleaned_data['hours'])
# print(hour.encode("utf-8"))
return super(BookingView, self).form_valid(form)
def get_success_url(self):
if self.success_url:
return self.success_url
return super().get_success_url()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['customer'] = CustomerForm()
return context
class SummaryView(generic.TemplateView):
template_name = 'booking_page/summary.html'
# if Customer.objects.all():
# latest_created_booking = Customer.objects.latest()
# latest_taken_hour_id = latest_created_booking.hours_id
# latest_taken_hour = FreeHoursModel.objects.filter(id=latest_taken_hour_id)[0]
# print(latest_taken_hour)
# latest_taken_hour.delete()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
return context
我试图删除与最新创建的客户实体相关的小时数据库实体
# if Customer.objects.all():
# latest_created_booking = Customer.objects.latest()
# latest_taken_hour_id = latest_created_booking.hours_id
# latest_taken_hour = FreeHoursModel.objects.filter(id=latest_taken_hour_id)[0]
# print(latest_taken_hour)
# latest_taken_hour.delete()
这是succes_url。但是这只在运行项目时删除最后一个实体,而不是在点击SummaryView时。请帮助任何建议
1条答案
按热度按时间roejwanj1#
这就是我处理这个问题的方法。首先,我将创建三个模型:
Customer
:负责保存客户信息。WorkHours
:白天我们可供预订的时间Booking
:保留预订信息。这也意味着我将创建两个视图:
CreateCustomerView
:用于创建客户。CreateBookingView
:创建预订。流程如下:
1.让客户在
CreateCustomerView
中输入其个人详细信息。1.如果setp 1成功,则将客户重定向到
CreateBookingView
,他们将在此预约。1.如果步骤2成功,则重定向到
SummaryView
。我也会使用Django的
ModelForm
来使表单创建和数据保存更容易。下面是我的示例代码:
models.py
值得注意的是
Booking
模型的Meta
类中的unique_together
属性。这是为了确保没有hour
和date
是相同的。所以,如果一个客户在今天的“16:00”预约,其他客户将无法预约。但是如果他们明天预订相同的hour
,他们将被允许,因为明天将是免费的。forms.py
我排除了
Booking
模型上的customer
字段,因为稍后将在视图中设置客户。浏览次数
当我使用基于类的视图时,我喜欢从基
View
继承,并且在相应的请求方法中继承我的逻辑。我发现这更容易,因为edit
视图(如FormView
,CreateView
)中的抽象更少。请注意:
CreateBookingView
正在接受user_pk
参数,该参数由CreateCustomerView
发送。它被用来获取和设置客户进行此预订。url
没有什么奇怪的,我希望这是不言自明的。
这个基本设置应该可以正常工作。您可能希望在某些方面改善用户体验。例如,在BookingView中,您只能显示客户选择的日期可用的
free hours
。这可能是一个很好的练习,可能需要一些JavaScript。