Can't split django views into subfolders - python

I'm following the directions from the first answer here:
Django: split views.py in several files
I created a 'views' folder in my app and moved my views.py file inside and renamed it to viewsa.py. I also created an init.py file in the 'views' folder.
My folder structure:
myproject/
myproject/
...
...
myapp/
__init__.py
urls.py
views/
__init__.py
viewsa.py
The first problem is in myapp/views/init.py I tried to do this:
from viewsa import *
and I get an "unresolved reference viewsa" error
I can however do this in the same file instead (in other words, it doesn't throw an error):
from . import viewsa
But I can't find any way to import these sub directory views into myapp/urls.py even following the directions in the link above. What am I doing wrong?

Use relative import, in your __init__.py:
from .viewsa import *
(notice the dot in .viewsa)

Related

Unable to find flask template [duplicate]

I am trying to render the file home.html. The file exists in my project, but I keep getting jinja2.exceptions.TemplateNotFound: home.html when I try to render it. Why can't Flask find my template?
from flask import Flask, render_template
app = Flask(__name__)
#app.route('/')
def home():
return render_template('home.html')
/myproject
app.py
home.html
You must create your template files in the correct location; in the templates subdirectory next to the python module (== the module where you create your Flask app).
The error indicates that there is no home.html file in the templates/ directory. Make sure you created that directory in the same directory as your python module, and that you did in fact put a home.html file in that subdirectory. If your app is a package, the templates folder should be created inside the package.
myproject/
app.py
templates/
home.html
myproject/
mypackage/
__init__.py
templates/
home.html
Alternatively, if you named your templates folder something other than templates and don't want to rename it to the default, you can tell Flask to use that other directory.
app = Flask(__name__, template_folder='template') # still relative to module
You can ask Flask to explain how it tried to find a given template, by setting the EXPLAIN_TEMPLATE_LOADING option to True. For every template loaded, you'll get a report logged to the Flask app.logger, at level INFO.
This is what it looks like when a search is successful; in this example the foo/bar.html template extends the base.html template, so there are two searches:
[2019-06-15 16:03:39,197] INFO in debughelpers: Locating template "foo/bar.html":
1: trying loader of application "flaskpackagename"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /.../project/flaskpackagename/templates
-> found ('/.../project/flaskpackagename/templates/foo/bar.html')
[2019-06-15 16:03:39,203] INFO in debughelpers: Locating template "base.html":
1: trying loader of application "flaskpackagename"
class: jinja2.loaders.FileSystemLoader
encoding: 'utf-8'
followlinks: False
searchpath:
- /.../project/flaskpackagename/templates
-> found ('/.../project/flaskpackagename/templates/base.html')
Blueprints can register their own template directories too, but this is not a requirement if you are using blueprints to make it easier to split a larger project across logical units. The main Flask app template directory is always searched first even when using additional paths per blueprint.
I think Flask uses the directory template by default. So your code should be like this
suppose this is your hello.py
from flask import Flask,render_template
app=Flask(__name__,template_folder='template')
#app.route("/")
def home():
return render_template('home.html')
#app.route("/about/")
def about():
return render_template('about.html')
if __name__=="__main__":
app.run(debug=True)
And you work space structure like
project/
hello.py
template/
home.html
about.html
static/
js/
main.js
css/
main.css
also you have create two html files with name of home.html and about.html and put those files in templates folder.
If you must use a customized project directory structure (other than the accepted answer project structure),
we have the option to tell flask to look in the appropriate level of the directory hierarchy.
for example..
app = Flask(__name__, template_folder='../templates')
app = Flask(__name__, template_folder='../templates', static_folder='../static')
Starting with ../ moves one directory backwards and starts there.
Starting with ../../ moves two directories backwards and starts there (and so on...).
Within a sub-directory...
template_folder='templates/some_template'
I don't know why, but I had to use the following folder structure instead. I put "templates" one level up.
project/
app/
hello.py
static/
main.css
templates/
home.html
venv/
This probably indicates a misconfiguration elsewhere, but I couldn't figure out what that was and this worked.
If you run your code from an installed package, make sure template files are present in directory <python root>/lib/site-packages/your-package/templates.
Some details:
In my case I was trying to run examples of project flask_simple_ui and jinja would always say
jinja2.exceptions.TemplateNotFound: form.html
The trick was that sample program would import installed package flask_simple_ui. And ninja being used from inside that package is using as root directory for lookup the package path, in my case ...python/lib/site-packages/flask_simple_ui, instead of os.getcwd() as one would expect.
To my bad luck, setup.py has a bug and doesn't copy any html files, including the missing form.html. Once I fixed setup.py, the problem with TemplateNotFound vanished.
I hope it helps someone.
Check that:
the template file has the right name
the template file is in a subdirectory called templates
the name you pass to render_template is relative to the template directory (index.html would be directly in the templates directory, auth/login.html would be under the auth directory in the templates directory.)
you either do not have a subdirectory with the same name as your app, or the templates directory is inside that subdir.
If that doesn't work, turn on debugging (app.debug = True) which might help figure out what's wrong.
I had the same error turns out the only thing i did wrong was to name my 'templates' folder,'template' without 's'.
After changing that it worked fine,dont know why its a thing but it is.
You need to put all you .html files in the template folder next to your python module. And if there are any images that you are using in your html files then you need put all your files in the folder named static
In the following Structure
project/
hello.py
static/
image.jpg
style.css
templates/
homepage.html
virtual/
filename.json
When render_template() function is used it tries to search for template in the folder called templates and it throws error jinja2.exceptions.TemplateNotFound when :
the file does not exist or
the templates folder does not exist
Create a folder with name templates in the same directory where the python file is located and place the html file created in the templates folder.
Another alternative is to set the root_path which fixes the problem both for templates and static folders.
root_path = Path(sys.executable).parent if getattr(sys, 'frozen', False) else Path(__file__).parent
app = Flask(__name__.split('.')[0], root_path=root_path)
If you render templates directly via Jinja2, then you write:
ENV = jinja2.Environment(loader=jinja2.FileSystemLoader(str(root_path / 'templates')))
template = ENV.get_template(your_template_name)
After lots of work around, I got solution from this post only,
Link to the solution post
Add full path to template_folder parameter
app = Flask(__name__,
template_folder='/home/project/templates/'
)
My problem was that the file I was referencing from inside my home.html was a .j2 instead of a .html, and when I changed it back jinja could read it.
Stupid error but it might help someone.
Another explanation I've figured out for myself
When you create the Flask application, the folder where templates is looked for is the folder of the application according to name you've provided to Flask constructor:
app = Flask(__name__)
The __name__ here is the name of the module where application is running. So the appropriate folder will become the root one for folders search.
projects/
yourproject/
app/
templates/
So if you provide instead some random name the root folder for the search will be current folder.

Can't import Django model into scrapy project

I have a folder Project which contains Django project called djangodb and Scrapy project called scrapyspider.
So it looks like:
Project
djangodb
djangodb
myapp
scrapyspider
scrapyspider
spiders
items.py
scrapy.cfg
__init__.py
I want to import model Product from myapp app in items.py
The problem is that it returns import error:
from Project.djangodb.myapp.models import Product as MyAppProduct
ImportError: No module named djangodb.myapp.models
Tried many things but couldn't avoid this error. Do you have ideas?
Your problem is that you're trying to do an import from a file that's outside from Django schema, to solve that you can overwrite the sys.pathvar which includes locations as the actual dir, so you can change it to:
import sys
sys.path.insert(0, 'C:\\Users\\your_path\\Project')
sys.path.insert(0, '/path/to/application/Project/') # Linux
# And then import #
from djangodb.myapp.models import Product as MyAppProduct

Django: Passing a static html file into view produce TemplateDoesNotExist error

I have a django app and a view for the home page where I want to use a static html file for the homepage. My file structure is like this:
project/
stats (this is my app)/
urls.py
views.py
stats.html
(other files here)
In my views.py I have the following code:
from django.shortcuts import render_to_response
def index(request):
return render_to_response('stats.html')
When I run the urls, I just have the index page. I go to the stats page and I receive a TemplateDoesNotExist Error. Looking for an answer I tried to put stats/stats.html instead for the path, but I still get the same error. What is the correct way of doing this?
In your project directory, add a directory called 'templates' and inside the templates directory, create 'stats' directory. Put your HTML file in the stats directory.
Then change your settings file at the bottom from
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'),
)
To
TEMPLATE_DIRS = (
    os.path.join(BASE_PATH, 'templates'),
)
You can arrange your project like this
project/
stats (this is my app)/
urls.py
views.py
stats.html
templates/
stats/
stats.html
In your views.py, write this:
def index(request):
return render_to_response('stats/stats.html')
make sure there is 'stats' in the INSTALLED_APPS list in the settings.py.

How to arrange files in Odoo

How do you arrange model files and controller files in their respective folders?
And what do you have to write in the __init__.py file?
Currently I have all my models and controllers in the root folder of the module like this
addons\
-->mymodule\
-->views\
-->view.xml
-->__init__.py
-->__openerp__.py
-->models.py
-->controllers.py
I have tried like this
addons\
-->models\
-->models.py
And then import the models.py using this inside __init__.py
from models import models
But this does not work
addons\
->yourmodule\
->controllers\
->__init__.py
->controllers.py
->models\
->__init__.py
->modelname.py
->__init__.py
->__openerp__.py
Content of the init.py in the controllers folder:
from . import controllers
Content of the controllers.py in the controllers folder:
from openerp import http
Content of the init.py in the models folder:
from . import modelname
Content of the init.py in the module folder:
from . import controllers
from . import models
Content of the openerp.py in the module folder: List of all your xml files (Instruction)

Could not import app.models in view file

First django app and am having a bit of trouble my project is laid out like this
MyProject
-dinners (python package, my app)
-views (python package)
__init__.py
dinners.py(conflict was here... why didn't I add this to the q.. sigh)
general.py
__init__.py
admin.py
models.py
tests.py
views.py
-Standard django project boilerplate
In my /views/general.py file it looks like this:
import os
import re
from django.http import HttpResponse
from django.template import Context,loader
from dinners.models import Dinner
def home(request):
first_page_dinners = Dinner.objects.all().order_by('-created_at')[:5]
t = loader.get_template('general/home.html')
c = Context({
'dinners':first_page_dinners,
})
return HttpResponse(t.render(Context()))
And in my urls.py file I have this regular expression to map to this view
url(r'^/*$','dinners.views.general.home', name="home")
However when I try to hit the home page I get this error:
Could not import dinners.views.general. Error was: No module named models
Removing the dinners.models import at the top of general.py (plus all of the model specific code) removes the error. Am I somehow importing incorrectly into the view file? Naturally I need to be able to access my models from within the view...
Thanks
UPDATE: answer I had a file dinners.py within the -views package that was conflicting
You need to put a __init__.py file in "dinners" and "views" folder to make those valid packages.
EDIT:
Also, remove that views.py file, that will create conflict with the package.

Categories