django 响应方法 POST 不呈现到 html 模板

django response method POST don't render to the html template

我在视图中有两个请求函数,一个使用 .get 方法,另一个使用 .post。这两个函数都可以正常工作,因为在终端中代码是 200。

[01/Apr/2021 08:04:39] "获取 /search/search HTTP/1.1" 200 4164 [01/Apr/2021 08:04:57] "POST /search/search HTTP/1.1" 200 4164

当我尝试使用 .post 方法将函数渲染到 html 模板时,问题就来了 html 页面上什么也没有出现。

def wind_search(request):
if request.method == 'post':
        city = request.post['city']
        weather_city_url = urllib.request.urlopen('api.openweathermap.org/data/2.5/weather?q=' + city + '&appid=1a7c2a40a0734d1dc18141fc6b6241bb').read()
        list_of_data = json.loads(waether_city_url)


        # main wind information
        wind_speed = list_of_data['wind']['speed']
            # wind_gust = wea['current']['wind_gust']
        wind_deg = list_of_data['wind']['deg']
        # wind conversiont m/s to knots
        def wind_converter(w):
            knots = 2
            kt = (float(w)) * knots
            return kt

        wind_response = wind_converter(wind_speed)
        #convert wind degree in cardinal direction.
        def degrees_to_cardinal(d):

            dirs = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']
            ix = round(d / (360. / len(dirs)))
            return dirs[ix % len(dirs)]

        direction = degrees_to_cardinal(wind_deg)

        wind_data = {

        "wind_response":wind_response,
        "wind_direction":direction,
        }

else:
    wind_data={}

    context = {"wind_data":wind_data}
return render(request, 'API/wind_search.html',context)

这是 html 模板:

    {% extends "API/base.html" %}
{% block content %}


<!--Jumbotron -->
 <div class="jumbotron jumbotron-fluid">
  <div class="container">
    <h1 class="display-4">Wind search</h1>
    <p class="lead">Write the city and check th wind condition. </p>
<!-- form input search tool -->
 <nav class="navbar navbar-expand-lg navbar-dark">
    <form method="post" class="col-md"">
      {% csrf_token %}
      <div class=" input-group">
      <input type="text" class="form-control" name="city" placeholder="Choose Your City ...">
      <div class="input-group-btn">
        <button type="submit" class="btn btn-primary">Search</button>
      </div>
      </div>

      </form>
  </nav>
  <div class="row">
    {% if wind_response and wind_direction %}
        <h4><span>Wind Speed :</span> {{wind_data.wind_speed}}</h4>
        <h4><span>Wind_Direction :</span> {{wind_data.wind_direction}}</h4>
      </div>
      {% endif %}
    </div>

{% endblock content %}

我认为问题出在 html 因为基本上视图不显示任何错误消息,所以我尝试更改几次 html 代码但没有成功。任何帮助/解释都很好。

非常感谢。

请设置渲染和重定向模板,

def wind_search(request):
    if request.method == 'POST':
        #this block of code manages if there is a POST request...
        city = request.POST.get('city')
        weather_city_url = urllib.request.urlopen('api.openweathermap.org/data/2.5/weather?q=' + city + '&appid=1a7c2a40a0734d1dc18141fc6b6241bb').read()
        list_of_data = json.loads(waether_city_url)
        
        # main wind information
        wind_speed = list_of_data['wind']['speed']
        # wind_gust = wea['current']['wind_gust']   
        wind_deg = list_of_data['wind']['deg']
        # wind conversiont m/s to knots
        
        def wind_converter(w):
            knots = 2
            kt = (float(w)) * knots
            return kt

        wind_response = wind_converter(wind_speed)
        #convert wind degree in cardinal direction.
        def degrees_to_cardinal(d):

            dirs = ['N', 'NNE', 'NE', 'ENE', 'E', 'ESE', 'SE', 'SSE', 'S', 'SSW', 'SW', 'WSW', 'W', 'WNW', 'NW', 'NNW']
            ix = round(d / (360. / len(dirs)))
            return dirs[ix % len(dirs)]

        direction = degrees_to_cardinal(wind_deg)

        wind_data = {

        "wind_response":wind_response,
        "wind_direction":direction,
        }
        # the page that you want to load after submitting your POST request <-----------------------------------------------------
        return redirect( 'redirect to a view ' )
    



    #the below block of code will cater for the GET method request
    else:
        wind_data={
            'foo' : 'foo'
        }

        #the page you want to render on a Get Request <-----------------------------------------------------
        return render(request,'render the required html for GET request' , wind_data)