ModuleNotFoundError, когда модуль, очевидно, установлен, Django
Мой финальный проект по курсу Python - создание сайта пиццы с помощью Django.
У меня есть init.py, forms.py, main.py, manage.py, models.py, myapp.forms, settings.py, и README.md, согласно тому, что Tabnine сказал, что мне нужно для запуска этого.
Каждый раз, когда я пытаюсь запустить сайт, вместо того, чтобы получить доступ к нему по адресу 127.0.0.1:8000, он не запускается, а в конце выдает ModuleNotFoundError: No module named myapp.forms, несмотря на то, что он есть, установлен правильно, как я могу сказать с помощью Pylint, и я в растерянности.
Содержание README:
PizzaProject/
├── myapp/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py # Your OrderForm should be here
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── PizzaProject/
├── manage.py
└── settings.py
init.py:
from django.apps import AppConfig
class MyappConfig(AppConfig):
name = 'myapp'
forms.py:
from django import forms
from django.db import models # Import models from django.db instead of django.models
class OrderForm(forms.ModelForm):
"""Form for creating and updating Order instances."""
class Meta:
"""Meta class for OrderForm."""
model = models.Model # Use models.Model instead of django.models.Model
fields = ['pizza', 'toppings', 'customer_name', 'customer_phone']
main.py:
from django.shortcuts import render, redirect
from myapp.forms import OrderForm
from myapp.models import Pizza, Topping
def menu_view(request):
"""View function for the menu page."""
pizzas = Pizza.objects.filter(is_available=True)
toppings = Topping.objects.filter(is_available=True)
return render(request, 'menu.html', {'pizzas': pizzas, 'toppings': toppings})
def confirm_order_view(request):
"""View function for the order confirmation page."""
if request.method == 'POST':
form = OrderForm(request.POST)
if form.is_valid():
order = form.save(commit=False)
order.calculate_total()
order.save()
form.save_m2m() # Save ManyToMany toppings
return redirect('order_success')
else:
form = OrderForm()
return render(request, 'confirm.html', {'form': form})
def success_view(request):
return render(request, 'order_success.html')
Тестовый файл, для размышлений:
"""This module contains test cases for the menu view."""
import django.test
from myapp.models import Pizza, Topping
class MenuViewTestCase(django.test.TestCase):
def setUp(self):
self.factory = django.test.RequestFactory()
Pizza.objects.create(name="Margherita", is_available=True)
Pizza.objects.create(name="Pepperoni", is_available=False)
Topping.objects.create(name="Cheese", is_available=True)
Topping.objects.create(name="Mushrooms", is_available=False)
myapp.forms:
from django import forms
from django.db import models # Import models from django.db instead of django.models
class OrderForm(forms.ModelForm):
"""Form for creating and updating Order instances."""
class Meta:
"""Meta class for OrderForm."""
model = models.Model # Use models.Model instead of django.models.Model
fields = ['pizza', 'toppings', 'customer_name', 'customer_phone']
settings.py:
INSTALLED_APPS = [
'myapp.apps.MyappConfig', # Add your app here#
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
Я могу включить models.py, но у меня там нет проблем, так что я могу придержать его, чтобы никто не смог забрать проект.
После ввода «python manage.py startapp myapp» в терминале проекта через PyCharm, он пытается запустить приложение, но завершается тем, что снова говорит: «ModuleNotFoundError: Нет модуля с именем myapp.forms. Изображение журнала ошибок
(.venv) PS C:\Users\ME\PycharmProjects\PizzaProject> python manage.py startapp myapp
INFO: Will watch for changes in these directories: ['C:\\Users\\ME\\PycharmProjects\\PizzaProject']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [16444] using WatchFiles
Process SpawnProcess-1:
Traceback (most recent call last):
File "C:\Users\ME\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 314, in _bootstrap
self.run()
File "C:\Users\ME\AppData\Local\Programs\Python\Python312\Lib\multiprocessing\process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\ME\PycharmProjects\PizzaProject\.venv\Lib\site-packages\uvicorn\_subprocess.py", line 80, in subprocess_started
target(sockets=sockets)
File "C:\Users\ME\PycharmProjects\PizzaProject\.venv\Lib\site-packages\uvicorn\server.py", line 65, in run
return asyncio.run(self.serve(sockets=sockets))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\ME\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Users\ME\AppData\Local\Programs\Python\Python312\Lib\asyncio\runners.py", line 118, in run
return self._loop.run_until_complete(task)
File "<frozen importlib._bootstrap>", line 1360, in _find_and_load
File "<frozen importlib._bootstrap>", line 1331, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 935, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 995, in exec_module
File "<frozen importlib._bootstrap>", line 488, in _call_with_frames_removed
File "C:\Users\ME\PycharmProjects\PizzaProject\main.py", line 2, in <module>
from myapp.forms import OrderForm
ModuleNotFoundError: No module named 'myapp.forms'
Я хочу иметь возможность подключаться к тестовому веб-сайту через URL по адресу 127.0.0.1:8000, как я и настроил.
Если кто-нибудь знает, почему он так себя ведет, я буду очень, очень признателен за помощь.
Вероятно, вы неправильно создали свой проект. Рекомендуется создать ваш проект Django с помощью команды django-admin startproject <project_name> .
Это должно быть сделано в виртуальном окружении, которое, судя по всему, вы уже используете. Также в этой среде должен быть установлен Django, что, как я полагаю, вы и сделали. Обратите внимание на точку .
после project_name
в команде startproject
. Рекомендуется использовать ее, если вы хотите получить более аккуратную структуру каталогов, см. ответ здесь Using period symbol after django-admin startproject <projectname>. Ваша директория project_name
должна содержать настройки файлов, WSGI, URL и т.д., а в корневой директории вы должны увидеть файл manage.py.
Вы можете продолжить создание приложения, используя команду python manage.py startapp <app_name>
Это создаст каталог app с моделями, представлениями, файлами и т.д. Здесь вы должны хранить файлы forms.py и urls.py уровня app, которые вы должны создать сами, см. https://realpython.com/django-setup/
Ваша ошибка: Я не уверен, почему у вас есть файл main.py, мне он кажется похожим на views.py
. Он не отображается в дереве каталогов, которым вы поделились, но вы включили этот файл, и именно отсюда и исходит ваша ошибка. Так что, возможно, вы захотите пролить на это больше света.
Кроме того, похоже, что вы хотите запустить локальный веб-сервер Django, но по ошибке выполняете команду создания нового приложения. Чтобы запустить локальный веб-сервер, используйте команду python manage.py runserver
. Убедитесь, что вы перенесли свои модели с помощью команд python manage.py makemigrations
и python manage.py migrate
. См. docs.
Обращайтесь в комментариях, если вам нужна дополнительная информация или помощь.