Vikas Gautam
Vikas Gautam

Reputation: 441

Django dynamic url

I trying to open content inside poster using a dynamic url, but I am facing a problem my code is for a simple web page containing some movie posters and when I click on a poster new template on a new page should open which will show information about this poster.

but whenever I click on a poster same template(index.html) opens in a new page instead of page.html

eg

127.0.0.1:8000/home is web page with all posters and I clicked on poster1 with id=1 then in new page 127.0.0.1/home/1 will open but it is still index.html with all posters, not page.html in which content of poster1 id=1 is stored.

Here is my code

homepage/models.py

from django.db import models

class Poster(models.Model):
    poster_name = models.CharField(max_length=20)
    poster_img = models.FileField(upload_to="poster_image/")

    def __str__(self):
        return self.poster_name


class Poster_page(models.Model):
    poster =  models.ForeignKey(Poster, default= 1)
    poster_name = models.CharField(max_length=20)
    poster_img = models.FileField()
    poster_details = models.TextField()

homepage/views.py

from django.shortcuts import render_to_response
from .models import Poster, Poster_page

def poster(request):
    pos = Poster.objects.all()
    return render_to_response('index.html', {'pos':pos})

def poster_page(request, id=1):
    poster_pg = Poster_page.objects.all()
    return render_to_response('page.html', {'poster_pg':poster_pg})

homepage.url

from django.conf.urls import url
from.views import poster, poster_page


urlpatterns = [
    url(r'^',poster),
    url(r'^home/(?P<id>/d+)/$', poster_page),

]

poster.url

from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^home/',include('homepage.urls', namespace='home'))
]


if settings.DEBUG:
    urlpatterns += static(settings.STATIC_URL, 
    document_root=settings.STATIC_ROOT)
    urlpatterns += static(settings.MEDIA_URL, 
    document_root=settings.MEDIA_ROOT)

index.html

<body>
<div class="row">
    {% for poster in pos %}
    <div class="col-md-4">
        
            <a href="{{poster.id}}" target="new"><img src="{{ poster.poster_img.url }}" alt="image"><h3>{{ poster.poster_name }}</h3></a>
    </div>
    {% endfor %}
</div>

page.html

<body>
<div class="row">
    <img src="{{ poster_img.url }}" alt="image"><h2>{{ poster_name }}</h2>
</div>
<div class="row">
    <h2>{{ poster_details }}</h2>       
</div>

Upvotes: 4

Views: 5148

Answers (3)

user6399774
user6399774

Reputation: 116

I think the issue is in the view with the context variable -

return render_to_response('index.html', {'pos':pos})

should be -

return render_to_response('index.html', {'poster':pos})

Because in you are calling {{poster.id}} in index template.

Upvotes: 0

Astik Anand
Astik Anand

Reputation: 13047

homepage.url

Replace d/+ by \d+

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

urlpatterns = [
    url(r'^$',views.poster),
    url(r'^(?P<id>\d+)/$', views.poster_page),
]

Then Try:

from django.shortcuts import render,get_object_or_404

def poster_page(request, id):
    poster_pg = get_object_or_404(Poster_page, id=id)
    return render_to_response('page.html', {'poster_pg':poster_pg})

and yes you also need <a href="/home/{{poster.id}}/">.

Upvotes: 3

Dharmesh Fumakiya
Dharmesh Fumakiya

Reputation: 2338

In index.html you have not defined correct url in href to open poster detail.

Correct syntax would be like this:

<a href="home/{{poster.id}}" target="new"><img src="{{ poster.poster_img.url }}" alt="image"><h3>{{ poster.poster_name }}</h3></a>

Upvotes: 2

Related Questions