I've looked at just about everything I can here. I'm using python 3.5 and i've seen stuff about how they've changed the way imports work. My django project structure is like this:
project
--app
--views/
--__init__.py
--myFile.py
--__init__.py
--models.py
--admin.py
--urls.py
--etc....
My urls.py is such:
from django.contrib import admin
from django.urls import path
from django.conf.urls import url, include
from . import views
urlpatterns = [
url(r'^api$', views.function_from_myFile_that_is_not_being_found),
otherurls()...
]
The error I'm getting is AttributeError: module 'app.views' has no attribute 'function_from_myFile_that_is_not_being_found'
I'm really lost as to why this is happening. I've tried putting imports in my __init__.py files and that hasn't worked either. Not sure what else I'm missing.
Thanks in advance.
In your project views is a package, not a single module. So you should do
from .views import myFile as views
Related
My src directory's layout is the following:
Learning
innit.py
settings.py
urls.py
wsgi.py
pages
innit.py
admin.py
apps.py
models.py
tests.py
views.py
Views.py has this code
from django.shortcuts import render
from django.http import HttpResponse
def home_view(*args,**kwargs):
return HttpResponse("<h1>Hello World, (again)!</h1>")
urls.py has this code
from django.contrib import admin
from django.urls import path
from pages.views import home_view
urlpatterns = [
path("", home_view, name = "home"),
path('admin/', admin.site.urls),
]
The part where it says 'pages.views' in 'from pages.views import home_view' has a yellow/orange squiggle underneath it meaning that it is having problems importing the file and it just doesn't see the package/application called 'pages' and doesn't let me import it even though the package has a folder called 'innit.py'. Even worse is the fact that the tutorial I am currently following receives no such error and I can't see anyone else who has encountered this error.
As you probably expect I am a beginner so I don't have experience and this is my first time editing views.html in Django so I may have made an obvious mistake if so, just point it out.
I tried doing
from ..pages.views import home_view
However it failed and gave me an error
I have also tried changing the project root however this now causes issues with the imports in 'views.py'.
The part where it says 'pages.views' in 'from pages.views import home_view' has a yellow/orange squiggle underneath it meaning that it is having problems importing the file and it just doesn't see.
You need to mark the correct "source root". This is for Django the project directory, which is the directory that contains the apps.
For example in PyCharm you click right on that directory, and use Mark Directory as… ⟩ Sources Root.
I tries to build my first Django project.
I've created 'superlist' project and 'lists' app inside. My project tree:
pycharm_project_folder
|
superlist
|
lists
superlist
manage.py
...
|
venv
My lists/views.py:
from django.shortcuts import render
def home_page():
"""home page"""
pass
My superlist/urls.py
from django.urls import path
from superlist.lists import views
urlpatterns = [
path('/', views.home_page, name='home')
# path('admin/', admin.site.urls),
]
My lists/test.py
from django.test import TestCase
from django.urls import resolve
from superlist.lists.views import home_page
class HomePageTest(TestCase):
"""тест домашней страницы"""
def test_root_url_resolves_to_home_page_view(self):
"""корневой url преобразуется в представление домашней страницы"""
found = resolve('/')
self.assertEqual(found.func, home_page)
So, when I run
python3 manage.py test
I see
ModuleNotFoundError: No module named 'superlist.lists'
I don't understad why I got it because paths were suggested by PyCharm
With Python3, you will want to use relative imports, especially when you have duplicated package names, like you do here. In superlist/urls.py try:
from .lists import views
This assumes the urls.py file is superlist/urls.py and not superlist/superlist/urls.py. If the latter is true, then it would be:
from .superlist.lists import views
So, in the end I just marked superlist folder as a 'source folder' in PyCharm. It resolved my issue
I'm changing view of homepage with app names pages.
I've added pages to settings. this is how directory look like:
- trydjango
- src/
- pages/
- __init__
- views
- products
- trydjango/
- __init__
- settings
- urls
- manage
views' code:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def home_view(*args, **kwargs):
return HttpResponse("<h1>Hello Again</h1>")
urls code
from django.contrib import admin
from django.urls import path
from src.pages.views import home_view
urlpatterns = [
path('admin/', admin.site.urls),
path('', home_view, name='home'),
]
and I see this error when I run server
ModuleNotFoundError: No module named 'src'
First you need to understand what an app in Django is compared to a project.
When you register an app django will look in the project root folder when you try to import it.
Your project root is where your manage.py file is. In your case the src folder.
So when you want to import your views module you need to state
from pages.views
rather than
from src.pages.views
I suggest that you read through and follow (by coding it yourself) the Django tutorial to learn more about project structure and creating your own apps with models, urls etc.
I got the same problem, IDE may use red underline but this code is still correct:
from pages.views
I did declare like from . import views in urls.py.
To use TemplateView, this urls.py is needed.
urls.py
from django.urls import path, re_path
from . import views
app_name = 'scheduler'
urlpatterns = [
re_path(r'^service/(?P<status>\w+)', views.SchedulerView.as_view(), name='schedule-service')
]
I think nothing but normal implementation.
Error occurs like the below.
from . import views
ImportError: cannot import name 'views'
Older versions django did work. But it's not working in django 2.0
App Structure
- server
- scheduler
- templatetags
schedule_status.py
urls.py
models.py
views.py
- main
settings.py
urls.py
- manage.py
I just guess 'scheduler' app's path is incorrect to work "from . import views"
Is there anyone who solved or check more things. these problem after django 2.0.
ps. sorry, I forgot to add view.py in structure in question. SchedulerView is declared in views.py
I did found a solution. python 3.6 has changed something.
I did create directory as views and added scheduler_view.py
and
from .views import scheduler_view as view
app_name = 'scheduler'
urlpatterns = [
re_path(r'^service/(?P<status>\w+)', view.SchedulerView.as_view(), name='schedule-service')
]
it doesn't occur error and runserver as well.
plus I did error occur again in another file. it's for older python.
scheduler_view.py
from scheduler import Scheduler -> from scheduler.scheduler import Scheduler
I did change it.
http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html
I wish it's helpful.
Following the django-rest tutorial
app/urls.py:
from django.conf.urls import url, include
from rest_framework import routers
from app.abbr import views
router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)
router.register(r'groups', views.GroupViewSet)
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
Directory structure:
Error:
File "..../app/app/urls.py", line 3, in
from app.abbr import views
ImportError: No module named 'app.abbr'
So, sigh...
It would have been useful if you pointed to the tutorial that showed you to do this.
You should not import from app; that refers to the inner directory containing your urls.py. Just import from abbr.
from abbr import views
And what if you change import like this?
from app.app.abbr import views?
I am considering that you are using django 1.9 +
Try this
from . import views
The root directory folder named App in your case is named after your project name by default when you start a new project via the django-admin startproject command.
you can rename your root directory folder to whatever you want and it won't affect your project.
when in your code are importing from app, it is actually looking inside the 'app' folder containig the 'settings.py' file.
the django-rest tutorial you are following contains an error when they are doing from tutorial.quickstart import views which should be from quickstart import views
so the same goes for you, you should do from abbr import views