django возвращает или публикует неправильный HTML-шаблон?

#python #django #url

#питон #джанго #url-адрес

Вопрос:

В прошлом месяце я разработал проект django с именем «dms» и приложение с именем «add_excel». Приложение получает файлы Excel с веб-страницы и сохраняет данные в базе данных mysql. Сегодня я добавил еще два приложения, «add_struct» и «homepage», которые должны быть еще одним функциональным приложением и приложением homepage. Но появляется что-то странное. После того, как я нажал кнопку «загрузить» в приложении «add_excel», вместо его оригинальных функций он перенаправляет на «домашнюю страницу», ничего не делая с базой данных.

Код VS показывает:

[18 / Apr / 2019 11:08:00] «GET / HTTP / 1.1» 200 317 # Я открыл домашнюю страницу [18 / Apr / 2019 11:08:02] «GET / addexcel /index / HTTP / 1.1» 200 1341 # Я нажал на приложение «add_excel»гиперссылка [18 / Apr / 2019 11:08:20] «СООБЩЕНИЕ / домашняя страница / индекс / HTTP / 1.1» 200 317 #

Я нажал «загрузить», но он снова перенаправил меня на домашнюю страницу.

Если я удалю URL-адрес домашней страницы в urls.py для всего проекта и снова нажмите кнопку загрузить, там будет написано:

Страница не найдена (404) Метод запроса: URL-адрес запроса POST: http://127.0.0.1:8000/homepage/index / Используя URLconf, определенный в dms.urls, Django попробовал эти шаблоны URL-адресов в следующем порядке:

^admin/ ^$ [name=’index’] ^addexcel/ ^addstruct/ Текущий путь, домашняя страница/индекс /, не соответствует ни одному из них.

В urls.py в проекте dms:

 from django.contrib import admin
from django.conf.urls import url, include
from homepage.views import index # default homepage

urlpatterns = [
    url(r'^admin/', admin.site.urls), 
    url(r'^

urls.py в приложении add_excel:

 from django.conf.urls import url
from django.urls import path
from django.contrib import admin
from add_excel.views import IndexView
urlpatterns = [
       url(r'index/', IndexView.as_view(), name ='index'),
       ]
 

urls.py в приложении add_struct:

 from django.conf.urls import url
from django.urls import path
from django.contrib import admin
from add_struc.views import IndexView
urlpatterns = [
       url(r'index/', IndexView.as_view(), name ='index'),
       ]
 

urls.py в приложении домашняя страница:

 from django.conf.urls import url
from django.urls import path
from django.contrib import admin
from homepage.views import index
urlpatterns = [
       url(r'index/', index, name='index'),
       ]
 

views.py в приложении add_excel:

 # -*- coding:utf-8 -*-
import os
import os.path
import sys
import datetime
from builtins import int
from django.db import models
from django.shortcuts import render
from django.views import View
import pymysql
import xlrd
from xlrd import xldate_as_tuple

# Create your views here.
class IndexView(View):
    template_name = 'add_excel/index.html'
    context={}
    def get(self, request):
        return render(request, 'add_excel/index.html', {})

    def post(self, request):
        # if request.method == 'POST' and 'excel_file' in request.POST:
        if request.method == 'POST' and request.FILES["excel_file"]:
            # do something
            return render(request, 'add_excel/index.html', {"excel_data":excel_data})
 

Ответ №1:

Вы используете это имя index во всех своих шаблонах URL-адресов, что вызывает конфликт. Они должны иметь правильное пространство имен ( homepage-index , excel-index и т.д.), Поэтому, когда вы ссылаетесь на них в своем приложении, как разработчикам, так и программе очевидно, какой URL следует выбрать.

Моя теория заключается в том, что в вашей HTML-форме есть какая-то генерация URL-адреса, которая использует имя index , и ваш сайт Django выбирает домашнюю страницу для URL-адреса, поэтому ваш IndexView не запускается.

Комментарии:

1. Спасибо! Оказывается, шаблон url должен быть изменен, как вы сказали, и HTML-файл также должен быть изменен, например <form action="{% url "add_excel-index" %}" method="post" enctype="multipart/form-data"> или это может пойти не такстраница, в данном случае домашняя страница.

, index, name='index'), # homepage
url(r'^addexcel/', include('add_excel.urls')),
url(r'^addstruc/', include('add_struc.urls')),
]
urls.py в приложении add_excel:


urls.py в приложении add_struct:


urls.py в приложении домашняя страница:


views.py в приложении add_excel:


Ответ №1:

Вы используете это имя index во всех своих шаблонах URL-адресов, что вызывает конфликт. Они должны иметь правильное пространство имен ( homepage-index , excel-index и т.д.), Поэтому, когда вы ссылаетесь на них в своем приложении, как разработчикам, так и программе очевидно, какой URL следует выбрать.

Моя теория заключается в том, что в вашей HTML-форме есть какая-то генерация URL-адреса, которая использует имя index , и ваш сайт Django выбирает домашнюю страницу для URL-адреса, поэтому ваш IndexView не запускается.

Комментарии:

1. Спасибо! Оказывается, шаблон url должен быть изменен, как вы сказали, и HTML-файл также должен быть изменен, например <form action=»{% url «add_excel-index» %}» method=»post» enctype=»multipart/form-data»> или это может пойти не такстраница, в данном случае домашняя страница.