Django views and templates links

11,994

Solution 1

It i better to pass the value in the url instead of url parameter:

<ul>
    <li><a href="{% url 'quantities_all' %}>All</a></li>
    <li><a href="{% url 'quantities' '2' %}>Subset1</a></li>
    <li><a href="{% url 'quantities' '3' %}>Subset2</a></li>
    <li><a href="{% url 'quantities' '4' %}>Subset3</a></li>
</ul>

You view will look like this:

def quantities(request, value=None):
    if value in ('2', '3', '4'):
        levels = Model_1.objects.filter(createria=int(value))
    else:
        levels = Model_1.objects.all()
    ...

And don't forget to change you url to:

url(r'^quantities/$', 'app.views.quantities', name='quantities_all'),
url(r'^quantities/(\d+)/$', 'app.views.quantities', name='quantities'),

Solution 2

You need to capture quantities in your url configuration. https://docs.djangoproject.com/en/1.7/topics/http/urls/

That's better than passing GET params because you have a link, and link like this http://example.org/quantities/4/ look's better and in Django it is a convention:

<ul>
    <li><a href="{% url 'quantities' 1 %}">All</a></li>
    <li><a href="{% url 'quantities' 2 %}">Subset1</a></li>
    <li><a href="{% url 'quantities' 3 %}">Subset2</a></li>
    <li><a href="{% url 'quantities' 4 %}">Subset3</a></li>
</ul>

So your urls.py could look like:

from django.conf.urls import patterns, url
from . import views

urlpatterns = patterns('',
    url(r'^quantities/(\d+)/$', views.quantities), )

views.py from another answer

def quantities(request, value):
    if value in ('2', '3', '4'):
        levels = Model_1.objects.filter(createria=int(value))
    else:
        levels = Model_1.objects.all()
    ...

Solution 3

Pass the value as GET parameter:

<ul>
    <li><a href="{% url 'quantities' %}?value=1">All</a></li>
    <li><a href="{% url 'quantities' %}?value=2">Subset1</a></li>
    <li><a href="{% url 'quantities' %}?value=3">Subset2</a></li>
    <li><a href="{% url 'quantities' %}?value=4">Subset3</a></li>
</ul>

Get it in view:

def quantities(request):
    value = request.GET.get('value', '1')
    if value == "1":
        levels = Model_1.objects.all()
    elif value == "2":
        levels = Model_1.objects.filter(createria=2)
    elif value == "3":
        levels = Model_1.objects.filter(createria=3)
    elif value == "4":
        levels = Model_1.objects.filter(createria=4)
Share:
11,994
wernerfeuer
Author by

wernerfeuer

Updated on June 04, 2022

Comments

  • wernerfeuer
    wernerfeuer almost 2 years

    My index.html template in Django has the following content:

    <ul>
        <li><a href="{% url 'quantities' %} value="1">All</a></li>
        <li><a href="{% url 'quantities' %} value="2">Subset1</a></li>
        <li><a href="{% url 'quantities' %} value="3">Subset2</a></li>
        <li><a href="{% url 'quantities' %} value="4">Subset3</a></li>
    </ul>
    

    Thus linking to same template, but (depending on the link clicked) I would like to write if functions in my app/views.py:

    def quantities(request):
        if value == "1":
            levels = Model_1.objects.all()
        elif value == "2":
            levels = Model_1.objects.filter(createria=2)
        elif value == "3":
            levels = Model_1.objects.filter(createria=3)
        elif value == "4":
            levels = Model_1.objects.filter(createria=4)
    

    Can I get the value of the link clicked in the previous page?

    • Andrii Zarubin
      Andrii Zarubin over 9 years
      You should pass it as a GET parameter at least like <li><a href="{% url 'quantities' %}?param=1>All</a></li>. In this case you can build your if as if request.GET.get('param') == 1: