Erich Purpur
Erich Purpur

Reputation: 1509

Django views confusion, two views show same content

I have a python django application. I had a view, which I duplicated and changed slightly to create a second view. But they seem to be hooked together and duplicate the page content, when they should be different.

Here is my urls.py

from django.urls import path, include
from django.contrib.auth import views as auth_views
from django.views.generic.base import RedirectView

from . import views

app_name = 'app'
urlpatterns = [

    # Journals by Discipline
    path('journals-by-discipline/', views.journals_by_discipline, name='journalsByDiscipline'),
    path('journals-by-discipline/chart-data/<str:discipline>/', views.journals_by_discipline_chart_data),
    path('journals-by-discipline/journals-and-disciplines-map/', views.get_journals_and_disciplines_map),
    path('journals-by-discipline/disciplines-list/', views.disciplines_list), 

    # Journals By Discipline (Elsevier)
    path('journals-by-discipline-elsevier/', views.journals_by_discipline_elsevier, name='journalsByDisciplineElsevier'),
    path('journals-by-discipline/chart-data/<str:discipline>/', views.journals_by_discipline_chart_data_elsevier),
    path('journals-by-discipline/journals-and-disciplines-map/', views.get_journals_and_disciplines_map),
    path('journals-by-discipline/disciplines-list/', views.disciplines_list), 
]

I have two views, journals_by_discipline and journals_by_discipline_elsevier

Here is my views.py

from django.shortcuts import get_object_or_404, render
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from rest_framework.decorators import api_view
from rest_framework.response import Response
import datetime as datetime
from dateutil.relativedelta import relativedelta
from urllib.parse import unquote
import json
from .onefigr_analysis import Data

# Instantiate Data object to fetch data across all views
data = Data()


# Journals by Discipline Page

def journals_by_discipline(request):
    template_name = 'app/journals-by-discipline.html'
    return render(request, template_name)

@api_view(['GET'])
def disciplines_list(request):

    if request.method == 'GET':
        return Response(data.get_disciplines_list())

@api_view(['GET'])
def journals_by_discipline_chart_data(request, discipline):

    if request.method == 'GET':
        query_discipline = unquote(discipline)
        return Response(data.journals_by_discipline_chart_data(discipline)) 

@api_view(['GET'])
def get_journals_and_disciplines_map(request):

    if request.method == 'GET':
        return Response(data.journals_and_disciplines_map())        



# Journals by Discipline Elsevier Page

def journals_by_discipline_elsevier(request):
    template_name = 'app/journals-by-discipline-elsevier.html'
    return render(request, template_name)   

@api_view(['GET'])
def disciplines_list(request):

    if request.method == 'GET':
        return Response(data.get_disciplines_list())

@api_view(['GET'])
def journals_by_discipline_chart_data_elsevier(request, discipline):

    if request.method == 'GET':
        query_discipline = unquote(discipline)
        return Response(data.journals_by_discipline_chart_data_elsevier(discipline)) 

@api_view(['GET'])
def get_journals_and_disciplines_map(request):

    if request.method == 'GET':
        return Response(data.journals_and_disciplines_map()) 

In my attempt to create the second view (journals by discipline elsevier), I duplicated the logic used to create the first view. But the result is both pages are the same.

In my Data() class, I have two methods: journals_by_discipline_chart_data and journals_by_discipline_chart_data_elsevier which are similar but not the same. I am trying to call these differently in my views.py file, but it is not working as it should.

How do I unhook these two views?

Upvotes: 0

Views: 44

Answers (1)

C14L
C14L

Reputation: 12548

path('journals-by-discipline/', views.journals_by_discipline),
path('journals-by-discipline/chart-data/<str:discipline>/', views.journals_by_discipline_chart_data),

path('journals-by-discipline-elsevier/', views.journals_by_discipline_elsevier),
path('journals-by-discipline/chart-data/<str:discipline>/', views.journals_by_discipline_chart_data_elsevier),

The first route in each block is different (journals-by-discipline/ != journals-by-discipline-elsevier/). But the second route is the same (both journals-by-discipline/chart-data/<str:discipline>/).

So the route journals-by-discipline/chart-data/<str:discipline>/ will always call the function views.journals_by_discipline_chart_data. It will never reach the second time the route is mentioned.

You could change the second route in the second block to journals-by-discipline-elsevier/chart-data/<str:discipline>/ to be consistant.

Upvotes: 2

Related Questions