从一个窗体创建模型实例两次

2024-03-29 08:52:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个显示课程的页面,其中包括DateTime。课程模型还有一个名为lesson_weekly的属性,这是一个复选框,如果用户希望每周重复该对象,可以选择该复选框。例如,如果日期被设置为2019-01-01 10:00 am,并且lesson_weekly被选中,我希望lesson对象被复制和显示,但是日期是+7,所以日期应该是2019-01-08 10:00am。我相信这可以通过简单地增加7天来完成,但我不确定如何做到这一点,使它正常工作,日期切换到下个月,如果它通过了最后一个日期,如30日或31日。如果您能给我一些建议,我将不胜感激

型号.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()

表单.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')

视图.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>

Tags: formtruedatetimemodelsformslevellengthlist
1条回答
网友
1楼 · 发布于 2024-03-29 08:52:57

如果不想复制课程对象,则需要生成课程的日期,并记住用户所选课程的频率。 考虑到这一点,我将在下面对其进行稍微不同的建模,从而使您的课程模型和不同的课程时间具有更大的灵活性和可伸缩性

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))]

相关问题 更多 >