所需的Django生成的时隙选择器始终为true,如何添加值> 0

时间:2019-01-24 18:25:52

标签: django django-forms django-views

我有一个预订系统,在其中输入可以预订的日期和时间段。 表单从日期获取时隙,并将其转换为用户时区时间。 我希望客户在继续填写表格之前先选择一个日期和一个可用的时隙,但是即使有要求也无法使用。

我有一个时隙模型,一个事件,日期+时隙模型 然后是一个表格,使客户可以选择可用的日期和时间段,并使用html查找每天可用的时间段

html

<option value="">{% if time_slots %}Available Slots{% else %}No Slot Available{% endif %}</option>
{% for time_set in time_slots %}
<option value="{{ time_set.pk }}">{{ time_set.start }} - {{ time_set.end }}</option>
{% endfor %}

模型

class TimeSlots(models.Model):
    start = models.TimeField(null=True, blank=True)
    end = models.TimeField(null=True, blank=True)

    class Meta:
        ordering = ['start']

    def __str__(self):
        return '%s - %s' % (self.start.strftime("%I:%M %p"), self.end.strftime("%I:%M %p"))

class Event(models.Model):
    event_date = models.DateField()
    start = models.ForeignKey(TimeSlots, on_delete=models.CASCADE, verbose_name='Slot Time', null=True)
    available = models.BooleanField(default=True)

    class Meta:
        verbose_name = u'Event'
        verbose_name_plural = u'Event'

    def __str__(self):
        return str(self.event_date)

    def get_absolute_url(self):
        url = reverse('admin:%s_%s_change' % (self._meta.app_label, self._meta.model_name), args=[self.pk])
        return u'<a href="%s">%s</a>' % (url, str(self.start))

表格

class PatientForm(forms.ModelForm):

    class Meta:
        model = Patient
        fields = ('patient_name', 'patient_country','phone_number', 'email', 'event_date','start', 'timestamp', 'datestamp')
        widgets = {
            'event_date': DateInput(),
            'patient_country': CountrySelectWidget(),
        }

    def __init__(self, *args, **kwargs):
        super(PatientForm, self).__init__(*args, **kwargs)
        self.fields['start'].queryset = TimeSlots.objects.none()

        if 'event_date' in self.data:
            try:
                event_id = self.data.get('event_date')
                # event = Event.objects.get(pk=event_id)
                self.fields['start'].queryset = TimeSlots.objects.filter(event__event_date=event_id, event__available=True)
            except (ValueError, TypeError):
                pass  # invalid input from the client; ignore and fallback to empty City queryset
        elif self.instance.pk:
            self.fields['start'].queryset = self.instance.timeslot_set

观看次数

class PatientCreate(CreateView):#was CreateView
    form_class = PatientForm
    template_name = 'appointment/index.html'

    def get_context_data(self, **kwargs):  # new
        context = super(PatientCreate, self).get_context_data(**kwargs)
        context['key'] = settings.STRIPE_PUBLISHABLE_KEY
        return context


def load_time_slots(request):
    event_date = request.GET.get('event_date')
    client_timezone = request.GET.get('timezone')
    client_timezone = pytz.timezone(client_timezone)
    event_date, original_date = get_original_event_date_by_timezone(client_timezone, event_date)

    time_slots = TimeSlots.objects.filter(event__event_date= event_date, event__available=True)
    final_time_slots = []
    for time_slot in time_slots:
        start_time = time_slot.start
        original_start_date_time = original_date.replace(hour=start_time.hour, minute=start_time.minute,
                                                         second=start_time.second,
                                                         tzinfo=original_time_zone)
        timezone_start_date_time = original_start_date_time.astimezone(client_timezone)

        end_time = time_slot.end
        original_end_date_time = original_date.replace(hour=end_time.hour, minute=end_time.minute,
                                                       second=end_time.second,
                                                       tzinfo=original_time_zone)
        timezone_end_date_time = original_end_date_time.astimezone(client_timezone)
        final_time_slots.append({'pk': time_slot.pk, 'start': timezone_start_date_time.time,
                                 'end': timezone_end_date_time.time})

    return render(request, 'appointment/dropdown_list_options.html', {'time_slots': final_time_slots})


def get_original_event_date_by_timezone(client_timezone, event_date):
    client_date = datetime.datetime.strptime(event_date, '%Y-%m-%d')
    client_date = client_date.replace(tzinfo=client_timezone)
    original_date = client_date.astimezone(original_time_zone)
    original_date = original_date.replace(hour=0, minute=0, second=0, microsecond=0)
    event_date = original_date.strftime('%Y-%m-%d')
    return event_date, original_date


def create_event(request, start_time, day_date):
    time_slot = TimeSlots.objects.get(start=start_time)
    Event.objects.create(event_date=day_date, start=time_slot)
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

表单页面html

<div class="container" style="margin-top:50px;margin-bottom:50px;">

    <div class="stepwizard col-md-offset-3">
      <div class="stepwizard-row setup-panel">
        <div class="stepwizard-step">
          <a href="#step-1" type="button" class="btn btn-primary btn-circle">1</a>
          <p>Date & Time</p>
        </div>
        <div class="stepwizard-step">
          <a href="#step-2" type="button" class="btn btn-default btn-circle" disabled="disabled">2</a>
          <p>Information</p>
        </div>
        <div class="stepwizard-step">
          <a href="#step-3" type="button" class="btn btn-default btn-circle" disabled="disabled">3</a>
          <p>Calling Method</p>
        </div>
        <div class="stepwizard-step">
          <a href="#step-4" type="button" class="btn btn-default btn-circle" disabled="disabled">4</a>
          <p>Payment Method</p>
        </div>
      </div>
    </div>



    <form role="form" action="{% url 'charge' %}" method="POST" id="patientForm" data-times-url="{% url 'ajax_load_time_slots' %}">
      <div class="row setup-content" id="step-1">
        <div class="col-xs-6 col-md-offset-3">
          <div class="col-md-12">
            <h3> Appointments date and time</h3>
            <div class="form-group">
              <label class="control-label" for="id_event_date">Event Date:</label>
              <input class="form-control" type="date" name="event_date" id="id_event_date" required="required" />
            </div>

            <div class="form-group">
              <label class="control-label" for="id_start">{% trans "Time:"%}</label>
              <p><select required="required" class="form-control" name="start" style="display:inline;" id="id_start">
                <option value="">---------</option></select></p><input type="hidden" name="timezone">
      <script>$("#patientForm input[name='timezone']").val(Intl.DateTimeFormat().resolvedOptions().timeZone);</script>
        </select></p>
            </div>
            <button class="btn btn-primary nextBtn btn-lg pull-right" type="button">Next</button>
          </div>
        </div>
      </div>

      <div class="row setup-content" id="step-2">
        <div class="col-xs-6 col-md-offset-3">
          <div class="col-md-12">
            <h3> Step 2</h3>
            <div class="form-group">
              <label for="id_patient_fname" class="control-label">First Name:</label>
              <input  name="patient_name" id="id_patient_name" required="required" maxlength="100" type="text" class="form-control" placeholder="Enter First Name" />
            </div>
            <div class="form-group">
              <label class="control-label">Last Name:</label>
              <input required="required" maxlength="100" type="text" class="form-control" placeholder="Enter Last Name" />
            </div>
            <div class="form-group">
              <label for="id_phone_number" class="control-label">Phone Number:</label>
              <input name="phone_number" id="id_phone_number" required="required" maxlength="100" type="text" class="form-control" placeholder="Enter Phone Number" />
            </div>
            <div class="form-group">
              <label for="id_emal" class="control-label">Email:</label>
              <input name="email" id="id_email" maxlength="100" type="text" required="required" class="form-control" placeholder="Enter Email" />
            </div>
            <div class="form-group">
              <label class="control-label">City</label>
              <textarea required="required" class="form-control" placeholder="Enter your address"></textarea>
            </div>
            <button class="btn btn-primary nextBtn btn-lg pull-right" type="button">Next</button>
          </div>
        </div>
      </div>

      <div class="row setup-content" id="step-3">
        <div class="col-xs-6 col-md-offset-3">
          <div class="col-md-12">
            <div class="form-group">
              <label class="control-label">Choose The Way You Want to Receive The Video Call:</label>
              <label class="radio-inline"><input class="form-control" type="radio" name="optradio" checked>Skype</label>
              <label class="radio-inline"><input class="form-control" type="radio" name="optradio">Whatsapp</label>
            </div>
            <button class="btn btn-primary nextBtn btn-lg pull-right" type="button">Next</button>
          </div>
        </div>
      </div>

      <div class="row setup-content" id="step-4">
        <div class="col-xs-6 col-md-offset-3">
          <div class="col-md-12">
            <script src="https://checkout.stripe.com/checkout.js" class="stripe-button" data-key="pk_test_KPSQTmUOl1DLP2eMc7zlvcnS"
              data-description="Buying a 30mn Skype Session" data-amount="3000" data-locale="auto"></script>
          </div>
        </div>
      </div>
    </form>

  </div>

在表单页面的html中,我添加了选择所需的内容,但没有用 我需要客户选择让我们说29/01/2019,然后,如果有可用性,请选择一个时隙让我们说5.30pm-6.00pm,然后仅出现下一个箭头

1 个答案:

答案 0 :(得分:1)

使用CreateView来初始化ModelForm数据时有些棘手。因此,不要像下面的示例那样在ModelForm类下进行初始化:

您的表单:

CreateView

您的视图:

class PatientForm(forms.ModelForm):

    class Meta:
        model = Patient
        fields = ('patient_name', 'patient_country','phone_number', 'email', 'event_date','start', 'timestamp', 'datestamp')
        widgets = {
            'event_date': DateInput(),
            'patient_country': CountrySelectWidget(),
        }

而且,为了知道为什么需要这样做。 class PatientCreate(CreateView): form_class = PatientForm template_name = 'appointment/index.html' initial = {} def get_initial(self): base_initial = super().get_initial() # it's a simple dict # initialize your form's data here # Your logic ... return base_initial # The rest of your logic ... 继承自CreateView,后者有FormMixininitial,因此将初始化您的表单数据,而不是在您的表单下进行。 有关更多详细信息,请参见以下链接:CreateView MROFormMixin