首页 > 解决方案 > 在 django 中请求调用 Post 的问题

问题描述

我正在POST调用在函数中添加事件,on_message()其中 step 是调用addEvent函数(添加事件)的 URL,然后是具有我定义的值的有效负载(在mqtt_iot文件内)。

编译器不会进入addEvent函数,它会锁定但不会出错(我正在使用终端)。我附上代码。我该如何解决?

mqtt_Iot.py

def on_message(client, userdata, msg):
    
    #convert byte json to json object and then to python dict to extract urls parameters
    byte_payload = msg.payload
    string_payload = byte_payload.decode('utf-8')
    data_dict = json.loads(string_payload)
    group_id = data_dict['group_id']
    calendar_id = data_dict['calendar_id']
    #in base al topic su cui ho ricevuto il messaggio faccio un azione o l'altra
    if ( msg.topic == "event/update"):
       #invio l'evento più prossimo alla board 
       client.publish(group_id,calendar_id)
    elif ( msg.topic == "event/new"):
       #il messaggio attiverà l'aggiunta di un evento facendo una post sul link adatto
       url = 'http://127.0.0.1:8000/homeProva1/%d/calendars/%d/events/new/' % (group_id,calendar_id)
       now= datet.datetime.now().time()
       end_time = datet.datetime.now() + datet.timedelta(hours=1)
       end_time = end_time.strftime("%H:%M:%S")
       now = now.strftime("%H:%M:%S")
       dt = datet.datetime.today()
       dt = dt.strftime("%Y-%m-%d")

       title = "Evento Node"
       description = "Evento prenotato in loco"
    
       payload = {"title": title, "day": dt, "start_time": now, "end_time": end_time, "notes":description}
       
       print("Payload")
       print(type(payload))
       print(payload)
       resp = requests.post(url,data=payload)
       content= response.content
       print (content)

views.py

def addEvent(request, pk=None ,pk1=None):
    print("sono dentro add event")
    instance = Event()
    instance = Event(calendar_id=pk1)
    
    form = EventForm(request.POST or None, instance=instance)
    if request.POST and form.is_valid():
        print(form)
        form.save()
        print("form valido")
        #controllo se evento appena aggiunto si svolgerà prima di un dato tempo ed in caso richiamo il publisher
        e = Event.objects.filter(calendar=pk1).latest('id')
        now= datetime.now().time()
        #trasformo orari in int per poter sottrarre
        now= int(now.strftime('%H%M%S'))
        temp= int(e.start_time.strftime('%H%M%S'))
        #se l'evento avviene fra meno di un ora chiamo la publish
        
        if((temp-now) < 6000):
           publish(pk,pk1)
        
        return HttpResponseRedirect(reverse('cal:home'))
    return render(request, 'cal/form.html', {'form': form})

urls.py

  path('homeProva1/<int:pk>/calendars/<int:pk1>/events/new/', views.addEvent, name='event_newprova1'),

models.py

class Event(models.Model):
    title = models.CharField(u'Title of the event', help_text=u'Title of the event', max_length=200, default='') 
    day = models.DateField(u'Day of the event', help_text=u'Day of the event')
    start_time = models.TimeField(u'Starting time', help_text=u'Starting time')
    end_time = models.TimeField(u'Final time', help_text=u'Final time')
    notes = models.TextField(u'Textual Notes', help_text=u'Textual Notes', blank=True, null=True)

    calendar = models.ForeignKey(Calendar, on_delete = models.CASCADE)

forms.py

class EventForm(ModelForm):
    class Meta:
        model = Event
        fields = ('title', 'day', 'start_time', 'end_time','notes',)

标签: djangodjango-modelsdjango-formsdjango-viewsdjango-request

解决方案


通过将两者结合起来,request.POST and form.is_valid()如果验证表单无效,您将永远不会呈现它,因此您永远不会看到错误。

您需要简化该视图中的逻辑,并确保包含错误的表单返回到页面时错误完好无损;

def addEvent(request, pk=None ,pk1=None):
    print("sono dentro add event")
    instance = Event()
    instance = Event(calendar_id=pk1)
    
    if request.method == "POST":
        form = EventForm(request.POST or None, instance=instance)
        if form.is_valid():
            form.save()
            print("form valido")
            #controllo se evento appena aggiunto si svolgerà prima di un dato tempo ed in caso richiamo il publisher
            e = Event.objects.filter(calendar=pk1).latest('id')
            now= datetime.now().time()
            #trasformo orari in int per poter sottrarre
            now= int(now.strftime('%H%M%S'))
            temp= int(e.start_time.strftime('%H%M%S'))
            #se l'evento avviene fra meno di un ora chiamo la publish
        
            if((temp-now) < 6000):
               publish(pk,pk1)
        
            return HttpResponseRedirect(reverse('cal:home'))
    else:
        # GET request
        form = EventForm(instance=instance)

    # An invalid POST request still hits here, where form contains errors
    return render(request, 'cal/form.html', {'form': form})

然后在您的模板中确保显示非字段错误以及字段错误;


<form method="post" action=''>
    {% csrf_token %}

    {% if form.non_field_errors %}
        {{ form.non_field_errors }}
    {% endif %}

    {% for hidden in form.hidden_fields %}
        {{ hidden }}
    {% endfor %}

    {% for field in form.visible_fields %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
            {% if field.help_text %}
                <p class="help">{{ field.help_text|safe }}</p>
            {% endif %}
        </div>
    {% endfor %}

    <button type="button" value="submit">Submit</button>
    <button type="button" value="cancel">Cancel</button>
</form>

推荐阅读