Django Сгенерированный выбор временных интервалов Требуется всегда true, Как добавить значение> 0 - PullRequest
0 голосов
/ 24 января 2019

У меня есть система бронирования, в которой я ввожу даты и временные интервалы, доступные для бронирования. форма получает временные интервалы от даты и преобразует их в часовой пояс пользователя. Я хочу, чтобы клиент выбрал дату и доступный временной интервал перед продолжением формы, но даже если требуется, он не работает.

у меня есть модель для временных интервалов и одна для события, дата + временной интервал затем форма, позволяющая клиенту выбрать доступную дату + временной интервал, с 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, затем, если есть возможность, выберите временной интервал, скажем, с 17:30 до 18:00, и тогда появится только следующая стрелка

1 Ответ

0 голосов
/ 24 января 2019

С 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 наследуется от FormMixin, который имеет initial и get_initial(), поэтому инициализирует данные вашей формы вместо того, чтобы делать это в вашей форме.Смотрите эту ссылку для более подробной информации: CreateView MRO и FormMixin

...