我有一个显示课程的页面,其中包括DateTime
。课程模型还具有一个名为lesson_weekly
的属性,这是一个复选框,用户可以选择是否要每周重复一次该对象。例如,如果将日期设置为2019-01-01 10:00 am
,并且选中了lesson_weekly
,则我希望复制和显示lesson
对象,但该日期必须为+7,所以该日期将是2019-01-08 10:00
。我相信可以通过在此日期前添加7天来完成此操作,但是不确定如何操作才能正常工作,并且如果日期超过了最后日期(例如30日或31日),则日期会切换到下个月。我将对如何执行此操作提出任何建议。
models.py
class Lesson(models.Model):
user = models.ForeignKey(User, null=True, default=None, related_name='lessons', on_delete=models.CASCADE)
lesson_instrument = models.CharField(max_length=255, choices=instrument_list, blank=True)
lesson_level = models.CharField(max_length=255, choices=level_list, blank=True)
lesson_length = models.CharField(max_length=255, choices=length_list, blank=True)
lesson_datetime_start = models.DateTimeField(null=True, blank=True)
lesson_weekly = models.BooleanField(default=False, blank=True)
def __str__(self):
return self.lessons
@receiver(post_save, sender=User)
def create_user_lessons(sender, instance, created, **kwargs):
if created:
Lesson.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_lessons(sender, instance, **kwargs):
for lesson in instance.lessons.all():
lesson.save()
forms.py
class LessonForm(forms.ModelForm):
lesson_instrument = forms.ChoiceField(choices=instrument_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
lesson_level = forms.ChoiceField(choices=level_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
lesson_length = forms.ChoiceField(choices=length_list, widget=forms.Select(attrs={'class' : 'form-control', 'required' : 'True'}))
lesson_datetime_start = forms.DateTimeField(input_formats=['%Y-%m-%d %I:%M %p'], widget=forms.DateTimeInput(attrs={'class': 'form-control', 'placeholder':'YYYY-MM-DD Hour:Minute am/pm'}))
lesson_weekly = forms.BooleanField(required=False)
class Meta:
model = Lesson
fields = ('lesson_instrument', 'lesson_level', 'lesson_length', 'lesson_datetime_start', 'lesson_weekly')
views.py
def profile(request, user_id):
if request.user.is_authenticated and request.user.time_zone:
activate(request.user.time_zone)
else:
deactivate()
lessons = Lesson.objects.filter(user=user_id).order_by('lesson_datetime_start')
user = User.objects.get(id=user_id)
form = TeacherProfileForm()
context = {'form' : form, 'user' : user, 'lessons' : lessons}
return render(request, 'view/profile.html', context)
HTML
<div class="table-responsive">
<table class="table">
<tbody>
{% for lesson in lessons %}
<tr>
<td scope="row">{{ lesson.lesson_instrument }}</td>
<td>{{ lesson.lesson_level }}</td>
<td>{{ lesson.lesson_length }}</td>
<td>
{% load tz %}
{% timezone user.time_zone %}
{{ lesson.lesson_datetime_start|date}}
{% endtimezone %}
</td>
<td>{{ lesson.lesson_datetime_start|time}}</td>
<td>$30</td>
<td>
<button type="submit" name="submit" class="btn blue_button">Book now</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
答案 0 :(得分:1)
您不想复制课程对象,而是要在记住用户选择课程的频率的同时生成课程日期。 鉴于此,我将对此建模,如下所示,从而为您的课程模型和不同的课程时间提供更大的灵活性和可扩展性。
class Lesson(models.Model):
FREQUENCY_TYPE_CHOICES = (
('DAILY', 'DAILY'),
('WEEKLY', 'WEEKLY'),
('MONTHLY', 'MONTHLY'),
)
user = models.ForeignKey(User, null=True, default=None,
related_name='lessons', on_delete=models.CASCADE)
lesson_instrument = models.CharField(max_length=255,
choices=instrument_list, blank=True)
lesson_level = models.CharField(max_length=255, choices=level_list,
blank=True)
lesson_length = models.CharField(max_length=255, choices=length_list,
blank=True)
lesson_datetime_start = models.DateTimeField(null=True, blank=True)
lesson_frequency = models.CharField(max_length=20,
choices=FREQUENCY_TYPE_CHOICES)
class LessonTime(models.Model):
lesson = models.ForeignKey(Lesson, related_name='lesson_times')
lesson_date = models.DateTimeField()
在模板中,当用户选择频率选项并输入开始日期时,您可以自动生成将来的日期并将其链接到课程实例。提交表格时,课程及其相应的课程日期都将保存。
根据开始日期,结束日期
生成日期## your start_date, end_date should be a datetime object
def generate_lesson_dates(start, end, step):
lesson_dates = []
current = start
while current < end:
lesson_dates.append(current)
current += step
generate_lesson_dates(start_date, end_date, datetime.timedelta(days=7))]