Django - 2-е приложение в проекте, страница не найдена - PullRequest
0 голосов
/ 08 мая 2020

Я не могу понять, что я делаю не так, во втором приложении моего проекта под названием «Погода». Первая часть, «дом», работает нормально. Я сделал так, чтобы пустой URL-адрес '' и URL-адрес с '/ home /' отображались на домашней странице. Даже ссылка, которую я создал на своей панели навигации на главную страницу, работает, но это не относится к ссылке погоды. Я получаю сообщение об ошибке «Страница не найдена 404».

Вот обзор: Структура проекта

Я включил приложение «Погода» в настройках установленных приложений.

Здесь файл urls.py в основной папке проекта:

from django.contrib import admin
from django.urls import path, include
from weather import views


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('blog.urls')),
    path('', include('weather.urls')),
    ]

Файл urls.py для моего приложения погоды:

from weather import views
from django.urls import path

urlpatterns = [
    path('', views.GetWeather.as_view(), name='weather'),

]

views.py для приложение погоды:

from django.views import generic
import requests
from django.shortcuts import render
from .models import City
from .forms import CityForm


class GetWeather(generic.ListView):

    queryset = City.objects.order_by('-requested')

    template_name = 'weather.html'

def index(request):
    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=c5a079de62bccff63d64ac8989f87e37'

    form = CityForm()

    cities = City.objects.all()

    weather_data = []

    for city in cities:

        r = requests.get(url.format(city)).json()

        city_weather = {
            'city' : city.name,
            'temperature' : r['main']['temp'],
            'description' : r['weather'][0]['description'],
            'icon' : r['weather'][0]['icon'],
        }

        weather_data.append(city_weather)

    context = {'weather_data' : weather_data, 'form' : form}
    return render(request, 'templates/weather.html', context)

models.py для приложения погоды:

from django.db import models
from django.contrib.auth.models import User

class City(models.Model):
    name = models.CharField(max_length=30)

    requested = models.DateTimeField(auto_now_add = True)

    class Meta:
        ordering = ['-requested']

    def __str__(self):
        return self.name

    class Meta:
        verbose_name_plural = 'cities'

Погода. html шаблон:

<!DOCTYPE html>
{% extends "base.html" %}
{% block content %}

<html>
<style>
    body {
        font-family: "Roboto", sans-serif;
        font-size: 18px;
        background-color: rgba(0, 0, 0, .75);
        }

    .head_text{
        color: white;
        }
    .card{
        box-shadow: 0 16px 48px #E3E7EB;
        }
</style>

        <div class="container">
            <div class="row">
                <div class="col-md-8 mt-3 left">
                    {% for city_weather in weather_data %}
                    <div class="card mb-4">
                        <div class="card-body">
                            <h2 class="media-left">
                                <figure class="image is-50x50">
                                    <img src="http://openweathermap.org/img/w/{{ city_weather.icon }}.png" alt="Image">
                                </figure>
                            </h2>
                            <div class="media-content">
                                <div class="content">
                                    <p>
                                        <span class="title">{{ city_weather.city }}</span>
                                        <br>
                                        <span class="subtitle">{{ city_weather.temperature }}° F</span>
                                        <br> {{ city_weather.description }}
                                    </p>
                                </div>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                </div>
            </div>
        </div>
</html>
{% endblock content %}

Это the blog.urls:

from . import views
from django.urls import path

urlpatterns = [
    path('', views.PostList.as_view(), name='home'),
    path('<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
]

Я очень благодарен всем, кто нашел время, чтобы прочитать это и помочь мне.

1 Ответ

0 голосов
/ 08 мая 2020

Вам нужно будет изменить либо blogs/urls.py, либо weather/urls.py первое совпадение URL. Это зависит от того, что вы хотите видеть в своем базовом URL.

# weather/urls.py

from weather import views
from django.urls import path

urlpatterns = [
    path('weather/', views.GetWeather.as_view(), name='weather'),

]
# blog/urls.py

from . import views
from django.urls import path

urlpatterns = [
    path('', views.PostList.as_view(), name='home'),
    path('blog/<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
]

Это разрешится, если вы хотите получить информацию о погоде на первой странице.

...