Django URL routing for one app - python

I am trying to return different templates for different urls (having just one app), so basically I want to return:
One template for:http://127.0.0.1:8000/projects/
Another template for:http://127.0.0.1:8000/formpage/
I have the project urls.py:
from django.conf.urls import url,include
from django.contrib import admin
from appone import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#home page
url(r'^$', views.index, name='index'),
url(r'^projects/', include('appone.urls')),
url(r'^formpage/', include('appone.urls')),
]
And the app urls.py:
from django.conf.urls import url,include
from django.http import HttpResponse
from . import views
urlpatterns = [
url(r'^$', views.projs, name='proj'),
url(r'^$', views.form_view, name='form_view')
]
I have the views and templates , that are good, but I do not understand how can I return them based on the url, because for the moment I return the first view from app urls.py, for both urls.

Make separate view functions for both urls (projs and form_view).
Then in projects/urls.py
urlpatterns = [
...
url(r'^projects/', views.projs, name='proj'),
url(r'^formpage/', views.form_view, name='form_view')
...
]`
Or, if you want to have separate urls.py file
projects/urls.py:
urlpatterns = [
url(r'^admin/', admin.site.urls),
#home page
url(r'^$', views.index, name='index'),
url(r'^', include('appone.urls')),
]`
appone/urls.py
urlpatterns = [
url(r'^projects/', views.projs, name='proj'),
url(r'^formpage/', views.form_view, name='form_view')
]`

Do you really need the second urls page? You could just set your first urls.py as:
from django.conf.urls import url,include
from django.contrib import admin
from appone import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#home page
url(r'^$', views.index, name='index'),
url(r'^projects/', views.projs, name='proj'),
url(r'^formpage/', views.form_view, name='form_view'),
]

Related

Page not found Error in my Django Project

I just started learning Django and got the following error:
[![The site doesn't see URL and then Error 404][1]][1]
urls.py - site
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('webexample/', include ('webexample.urls')),
]
urls.py - webexample
from django.urls import path
from . import views
urlpatterns = [
path(r'^$', views.index, name='index'),
]
views.py - webexample
from django.shortcuts import render
from django.http import HttpResponse
def index(request):
return HttpResponse("<h3>This page isn't set up yet...</h3>")
Error photo
change path to this to work for the current url.
path(r'', views.index, name='index')
You could do this
path('index/', views.index, name='index'),
or
re_path(r'^index/$', views.index, name='index'),
to know more about this, you can the django doc https://docs.djangoproject.com/en/3.0/ref/urls/

What is the correct way to link home and about page in django urls?

Right now what I am doing is this:
pages app > urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('about', views.about, name='about'),
]
project > urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('pages.urls')),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
This seems to work fine. I am able to go to the homepage and the about page fine, but I have seen other people do as in the following:
project > urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('pages.urls')),
path('about/', include('pages.urls')),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
So basically, in the project urls file, the line
'path('about/', include('pages.urls')),'
is added as well as keeping the pages url the same as above.
So I was wondering what is the correct way of linking the about page in the project urls file.
If you have more than a single view and a single url for it in your app and you want to put all of them after some url prefix you put that prefix in urls.py root.
So lets say you have products and categories views and you want them behind api prefix. That means /api/products/ and /api/categories/ then you would have in your "api" app:
from django.urls import path
from . import views
urlpatterns = [
path('products', views.products, name='products'),
path('categories', views.categories, name='categories'),
]
In your root urls.py:
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
in pages app you have to create urls.py file and link the url to the view
urlpatterns = [
path('about/', views.about, name='about'),]
and in templates you can call the url with its name

django 2.2.5 import url from one app to another app

I would like to use the url from products app (products/urls.py) inside of search app url (search/urls.py) to search for items/products using search bar. I've attempted this example on django docs but it's importing a view to url in the same app, and I've also attempted this example but it looks to be a solution for an older version of django but i am using the latest version of django at time time 2.2.5.
The error message I am receiving in terminal is coming from search/urls.py:
path('', views.ProductListView.as_view(), name='list'),
AttributeError: module 'search.views' has no attribute
'ProductListView'
I understand search.views does not have an attribute "ProductListView" but, products.views does, which is why i'm trying to import products.views in search/urls.py.
products/urls.py
from django.urls import path, re_path
from .import views
app_name = "products"
urlpatterns = [
path('', views.ProductListView.as_view(), name='list'),
re_path(r'^products/(?P<slug>[\w-]+)/$', views.ProductDetailSlugView.as_view(), name='detail'),
]
search/urls.py
from django.urls import path
from .import views
from products.views import ProductListView
urlpatterns = [
path('', views.ProductListView.as_view(), name='list'),
]
ecommerce/urls.py (main app)
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include, re_path
# from products.views import ProductDetailView
from .views import home, about, contact
urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
path('about/', about, name='about'),
path('contact/', contact, name='contact'),
path('account/', include('allauth.urls'), name='login'),
path('register/', include('allauth.urls'), name='register'),
path('products/', include('products.urls', namespace='products')),
path('search/', include('search.urls', namespace='search')),
# path('', include('products.urls'), name='products-featured'),
# path('', include('products.urls'), name='featured-details'),
# path('', include('products.urls'), name='featured-slug-details'),
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
You have:
from products.views import ProductListView
Therefore you should use ProductListView, not views.ProductListView
urlpatterns = [
path('', ProductListView.as_view(), name='list'),
...
]
Note you can remove the from .import views import unless you are using views somewhere else in search/urls.py
An alternative is to use import as, so that you can import multiple views.py from different apps in the same module:
from products import views as product_views
urlpatterns = [
path('', product_views.ProductListView.as_view(), name='list'),
]

How to change the default Django page to my own one?

I'm learning Django,and I followed a guidebook.I want to change the default Django page into my own one.It has took me 2 hours to solve this,and nothing worked.
The project is called learning_log,and the app is called learning_logs.
Here's what I'm trying to do:
1.add module learning_logs.urls:
"""
Definition of urls for learning_log.
"""
from datetime import datetime
from django.urls import path
from django.contrib import admin
from django.contrib.auth.views import LoginView, LogoutView
from app import forms, views
#added
from django.conf.urls import include, url
import learning_logs.views
from django.urls import path,re_path
app_name='learning_logs'
urlpatterns =[
path('', views.home, name='home'),
path('contact/', views.contact, name='contact'),
path('about/', views.about, name='about'),
path('login/',
LoginView.as_view
(
template_name='app/login.html',
authentication_form=forms.BootstrapAuthenticationForm,
extra_context=
{
'title': 'Log in',
'year' : datetime.now().year,
}
),
name='login'),
path('logout/', LogoutView.as_view(next_page='/'), name='logout'),
path('admin/', admin.site.urls),
#added
re_path(r'',include('learning_logs.urls',namespace='learning_logs'))
]
To include the module,I've tried:
url(r'',include('learning_logs.urls',namespacec='learning_logs'))
path('',include('learning_logs.urls',namespacec='learning_logs'))
path('',include('learning_logs.urls'))
path('',learning_logs.urls)
path('',learning_logs.views)
But none of them worked.
2.Create urls.py in learning_logs.here's the code:
"""define learning_logs's url mode"""
from django.urls import path,re_path
from . import views
from django.conf.urls import include,url
urlpatterns=[
#homepageļ¼š
re_path(r'(?P^$)',views.index,name='index')]
#path('',include('learning_logs.views.index'))]
As you can see,I also tried many times.
3.Write views.py in learning_logs
from django.shortcuts import render
# Create your views here.
def index(request):
"""homepage of learning logs"""
return render(request,'learning_logs/index.html')
4.write HTML document in learning_logs/templates/learning_logs/index.html
code skipped,for it never came up.
Here is my document tree:
tree
What I want is that show my own homepage at localhost:xxxxx/
How to solve this?
it's simple. just change this
urlpatterns =[
path('', views.home, name='home'),
to this
urlpatterns =[
path('', learning_logs.views.index, name='home'), #correct path to your index view
I don't understand what you're trying to do, why don't you just use:
urlpatterns =[
path('', views.home, name='home'),
And change the name so it directs you to that home page instead?
E.g.
urlpatterns =[
path('', views.learning_logs, name='learning logs'),
Also, since learning logs IS in the views file you shouldn't use
path('',learning_logs.views)
Does that make sense?

Django - creating a main page without an extension with request processing (not direct to template)

I'm very new to Django, while going through the tutorials how to start different apps inside of a project is clear to me, but not setting up the index page of the entire website.
Inside of my project folder it looks something like:
Projectname
App1
App2
App3
What I want to do is create a url with path looking something like this
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('index.urls')), #Homepage url
path('App1/', include('App1.urls')),
path('accounts/', include('django.contrib.auth.urls')),
path('App2/', include('App2.urls')),
path('App3/', include('App3.urls')),
path('admin/', admin.site.urls),
]
So that you can visit http://127.0.0.1:8000/ (or website.com) and see an index page with a corresponding view that I can use to show content from a database.
Maybe its as simple as creating an index-app and setting the path to (''), but I haven't been able to accomplish that.
You can just create index view inside app (e.g. app1), and use this view direcly with urlpatterns, like this:
from django.contrib import admin
from django.urls import path, include
from app1 import views
urlpatterns = [
path('', views.index), #Homepage url
path('App1/', include('App1.urls')),
path('accounts/', include('django.contrib.auth.urls')),
path('App2/', include('App2.urls')),
path('App3/', include('App3.urls')),
path('admin/', admin.site.urls),
]
Or if you'd like to keep index in undex.urls, you should add to index.urls file empty path:
# index urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
# project urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('', include('index.urls')), #Homepage url
path('App1/', include('App1.urls')),
path('accounts/', include('django.contrib.auth.urls')),
path('App2/', include('App2.urls')),
path('App3/', include('App3.urls')),
path('admin/', admin.site.urls),
]

Categories