0

##html

<form id="schedule-form" action="#" method="POST">
  {% csrf_token %}
....
<input type="submit" id="submit-horario" value="Confirmar"
      class="btn button-raised btn-green text-white text-uppercase fw-600 me-md-1 mt-3"
      onclick="gtag_confirmar_horario('S_{{ prestadorservicos.prestadorservicoid }}', '{{ servicoregioes.as_string|escapejs }}', '{{ menor_desconto.get_tipo_de_desconto_display|escapejs }}', '{{ menor_desconto.preco_desconto }}', '{{ prestadorunidade.as_string|escapejs }}', '{{ prestador.parceiro }}', '{{ prestadorservicos.preco }}')"/>
  </div>
</form>

##urls

from django.conf.urls import url
from django.urls import path
from . views import BuscaHorarios, AgendaHorario

app_name = "agendamento"

urlpatterns = [
    url(r'^(?P<prestadorservicosid>[0-9]+)(?:/(?P<unidadeid>[0-9]+))/$',
        BuscaHorarios.as_view(),
        name='horarios',
        ),
    url('/', AgendaHorario.as_view(), name="agenda_horario"),
]

When i submit this form i get 405 http error on console. There is no problem loading (get) this page [25/Mar/2022 11:55:38] "GET /agendamento/11749/1341/ HTTP/1.1" 200 19435 only to submit (post) [25/Mar/2022 11:56:51] "POST /agendamento/11749/1341/ HTTP/1.1" 405 0

function gtag_confirmar_horario(id, nome, tipo_desconto, preco_desconto, prestador, parceiro, preco) {
    if (!tipo_desconto) { tipo_desconto = 'Sem desconto' }
    preco = (preco == '' || preco == 'None') ? 0.00 : parseFloat(preco.replace(',', '.')).toFixed(2);
    preco_desconto = (preco_desconto == '' || preco_desconto == 'None') ? 0.00 : parseFloat(preco_desconto.replace(',', '.')).toFixed(2);
    gtag('event', 'Agendamento', {
        'send_to': 'UA-177268162-1', 'event_category': 'Clique',
        'event_label': 'Concluir agendamento online', 'servico': nome, 'prestador': prestador, 'parceiro': parceiro, 'preco': preco
    });
    gtag('event', 'select_item', { 'send_to': 'G-TSJXVDB6B7', 'items': [{ 'item_id': id, 'item_name': nome, 'promotion_name': tipo_desconto, 'item_list_name': 'Resultados da Busca', 'item_list_id': 'resultados_busca', 'affiliation': prestador }], 'item_list_name': 'Resultados da Busca', 'item_list_id': 'resultados_busca' });
    fbq('track', 'Lead', { content_category: 'Concluir agendamento online', content_name: id });
}

##views

class AgendaHorario(View):
    form_class_agenda = AgendaHorarioForm()
    paciente = {}
    prestadorunidade = None
    prestadorservicos = None
    servicoregioes = None
    agenda_service = None
    horario_marcado = None

    def get_context_data(self, **kwargs):
        print('a')
        context = super().get_context_data(**kwargs)
        context['prestadorunidade'] = self.prestadorunidade
        context['prestadorservicos'] = self.prestadorservicos
        context['horario_marcado'] = self.horario_marcado
        context['paciente'] = self.paciente
        print('a')
        return context

    def post(self, *args, **kwargs):
        print('b')
        if self.request.is_ajax and self.request.method == "POST":
            form = self.form_class_agenda(self.request.POST)
            if form.is_valid():
                post_data = form.cleaned_data

                self.paciente['nome'] = post_data['nome_paciente']
                self.paciente['email'] = post_data['email_paciente']
                self.paciente['telefone'] = post_data['telefone_paciente']

                lista_unidades = list(cache.get('PrestadorUnidades', PrestadorUnidades.objects.values()))
                unidadeid = int(self.request.POST.get('prestadorunidadeid'))
                self.prestadorunidade = [item for item in lista_unidades if item['unidadeid'] == unidadeid][0]

                lista_prestadorservicos = list(cache.get('PrestadorServicos', PrestadorServicos.objects.values()))
                prestadorservicosid = int(self.request.POST.get('prestadorservicosid'))
                self.prestadorservicos = [
                    item for item in lista_prestadorservicos if item['prestadorservicoid'] == prestadorservicosid][0]

                lista_servicos = list(cache.get('ServicosRegioesCorpo', ServicosRegioesCorpo.objects.values()))
                self.servicoregioes = [item for item in lista_servicos if item['idservicosregioes']
                                       == self.prestadorservicos['idservicosregioes_fk_id']][0]
                servico = ServicosRegioesCorpo.objects.get(
                    idservicosregioes=self.prestadorservicos['idservicosregioes_fk_id'])

                horario = self.request.POST.get('horario-escolhido')
                self.horario_marcado = refatora_data(horario)
                self.horario_marcado = datetime.datetime.strptime(self.horario_marcado, '%Y-%m-%dT%H:%M')

                prestadorunidade_calendar_list = list(cache.get('Calendar', Calendar.objects.values()))
                prestadorunidade_calendar = [item for item in prestadorunidade_calendar_list if item['id']
                                             == self.prestadorunidade['calendar_id_fk']][0]
                prestadorunidade_calendar_obj = Calendar.objects.get(id=self.prestadorunidade['calendar_id_fk'])

                self.agenda_service = GoogleCalendarService(
                    prestadorunidade_calendar, prestadorunidade_calendar_obj, self.prestadorservicos)
                self.marcar_servico(self.horario_marcado)

                msg_sucesso = f'%s agendado com sucesso para %s. Anote na sua agenda!' % (
                    servico, self.paciente['nome'])

                return JsonResponse({"msg_sucesso": msg_sucesso, "horario_marcado": horario}, status=200)
            else:
                return JsonResponse({"error": form.errors}, status=400)

        return JsonResponse({"error": ""}, status=400)

    def marcar_servico(self, horario):
        print('c')
        servico = ServicosRegioesCorpo.objects.get(
            idservicosregioes=self.prestadorservicos['idservicosregioes_fk_id'])
        summary = f'%s com paciente %s. Contato: %s ou %s' % (str(servico),
                                                              self.paciente['nome'],
                                                              self.paciente['telefone'],
                                                              self.paciente['email'])

        lista_bairros = list(cache.get('Bairros', Bairros.objects.values()))
        bairro = [item for item in lista_bairros if item['bairroid'] == self.prestadorunidade['bairroid_fk_id']][0]

        location = f'%s %i, %s\n%s, %s\n%s' % (self.prestadorunidade['logradourounid'],
                                               self.prestadorunidade['numerounid'],
                                               self.prestadorunidade['complementounid'],
                                               bairro['bairro'],
                                               bairro['cidade'],
                                               self.prestadorunidade['cep'])
        descricao = 'Agendado pelo Saúde Pra Já.'

        self.agenda_service.marcar_evento(summary, location, horario, descricao)

Added the class from views.py. There is another class but i think the error is in the AgendaHorario

  • 1
    Hi, i don't think you need a form action, try to delete it, use `
    ` if the problem persist please post your views.py code
    – Luiz Mar 25 '22 at 16:07
  • Just tried doing this way but got the same error. My views.py I'm not showing the imports and stuff I have 4 classes, the problem is rendenring the "AgendaHorario" ```class BuscaHorarios(ListView): class GoogleCalendarService: class AgendaHorario(View): form_class_agenda = AgendaHorarioForm() paciente = {} prestadorunidade = None prestadorservicos = None servicoregioes = None agenda_service = None horario_marcado = None def refatora_data(data_string):``` – Daniel Lourenco Mar 25 '22 at 21:47
  • This is the first method in AgendaHorario ```def get_context_data(self, **kwargs): print('a') context = super().get_context_data(**kwargs) context['prestadorunidade'] = self.prestadorunidade context['prestadorservicos'] = self.prestadorservicos context['horario_marcado'] = self.horario_marcado context['paciente'] = self.paciente print('a') return context``` But i couldn't even make the code run to this first "print('a')" – Daniel Lourenco Mar 25 '22 at 21:49
  • You can edit your question and add the code from your views to it, this way is kind hard to ready, but your problem is that you are using ListView, as django docs ( https://docs.djangoproject.com/en/4.0/ref/class-based-views/generic-display/#listview ) say, it doesn't suport POST requests, only suports GET requests, that's why you are receving method not allowed, change this to regular view ` class BuscaHorarios(View)` – Luiz Mar 26 '22 at 01:11
  • I'm trying to add the views.py but it's a lot of code, therefore i can't add all the views file – Daniel Lourenco Mar 27 '22 at 07:43
  • I added the class – Daniel Lourenco Mar 27 '22 at 08:41

0 Answers0