2017-11-07 3 views
0

템플릿을 포함하고 두 개의 다른보기에서 활용하려고합니다. 첫 번째 매개 변수는 하나의 url 매개 변수를 가져오고 두 번째 매개 변수는 동일한 것과 다른 하나를 얻습니다. 포함 된 템플릿 안에 {param} 두 태그를 모두 전달해야하는 {% url %} 태그가 포함 된 반복이 있습니다. 두 번째보기가 필요하기 때문에 첫 번째보기를 렌더링하려고 할 때 NoReverseMatch가 발생합니다. param. 두 번째 매개 변수를 지정하는 방법은 선택 사항입니까? 여기 Django - 포함 된 템플릿이 포함 된 여러 URL 매개 변수

내 코드입니다 :

urls.py

... 

    url(r'^portfolio/(?P<category_slug>[-\w]+)/$', views.category, name='category'), 
    url(r'^portfolio/(?P<category_slug>[-\w]+)/(?P<album_slug>[-\w]+)/$', views.album, name='album'), 

... 

models.py

... 

class Album(models.Model): 
    cover = models.ImageField() 
    title = models.CharField(max_length=200, unique=True) 
    description = models.CharField(max_length=200, blank=True) 
    posts = models.ManyToManyField(Post, blank=True) 
    slug = models.SlugField(max_length=200) 


class Category(models.Model): 
    cover = models.ImageField() 
    title = models.CharField(max_length=200, unique=True) 
    albums = models.ManyToManyField(Album, blank=True) 
    slug = models.SlugField(max_length=200) 


@receiver(pre_save, sender=Album) 
@receiver(pre_save, sender=Category) 
def save_slug(sender, instance, *args, **kwargs): 
    instance.slug = slugify(instance.title) 

... 

views.py

... 

    def index(request): 
     main_categories = Category.objects.filter(...) 
     return render(request, 'index.html', {'main_categories': main_categories}) 

    def category(request, category_slug): 
     try: 
      category_selected = Category.objects.get(slug=category_slug) 
     except Category.DoesNotExist: 
      category_selected = None 
     albums = category_selected.albums.all() 
     return render(request, 'category.html', { 
      'category_selected': category_selected, 
      'albums': albums 
     }) 


    def album(request, category_slug, album_slug): 
     try: 
      category_selected = Category.objects.get(slug=category_slug) 
      album_selected = Album.objects.get(slug=album_slug) 
     except Category.DoesNotExist: 
      category_selected = None 
     except Album.DoesNotExist: 
      album_selected = None 
     posts = album_selected.posts.all() 
     return render(request, 'album.html', { 
      'category_selected': category_selected, 
      'album_selected': album_selected, 
      'posts': posts 
     }) 

    ... 

includedtemplate.html

,363,210
... 

{% for obj in objects %} 

    ...  

    <a href="{% url view category_slug=obj.slug album_slug=obj.slug %}"> 

    ... 

{% endfor %} 

... 

index.html을

... 

{% include 'includedtemplate.html' with objects=main_categories view='category' %} 

... 

편집 : 나는 하나의 다른 슬러그 각각 내 URL을 분리하여이 문제를 해결하기 위해 관리했습니다. 카테고리와 앨범에 대해 M2M을 사용했음을 감안할 때 이것은 더 간단하고 내 상황에 더 잘 맞으며 단일 앨범에 대해 많은 URL을 유발할 수 있습니다.

답변

0

보기를 결합하고 album_slug에 None을 설정할 수 있습니다.

url(r'^portfolio/(?P<category_slug>[-\w]+)/$', views.combined_view, name='cview'), 
url(r'^portfolio/(?P<category_slug>[-\w]+)/(?P<album_slug>[-\w]+)/$', views.combined_view, name='cview'), 

P.S. -

def combined_view(request, category_slug, album_slug=None): 

    category_selected = Category.objects.filter(slug=category_slug).first() 
    album_selected = None 
    posts = None 
    template = 'category.html' 

    if album_slug: 
     album_selected = Album.objects.filter(slug=album_slug).first() 
     posts = album_selected.posts.all() 
     template = 'album.html' 

    return render(request, template, { 
     'category_selected': category_selected, 
     'album_selected': album_selected, 
     'posts': posts 
    }) 

는 또한 URL의 순서가 중요 제 URL이 두 파라미터를 하나 개의 파라미터로 초이어야 try .. except 대신에 filter(). first()를 사용할 수 있습니다. 그것은 작성하는 것이 더 빠릅니다.

+0

우선, 늦은 답변에 대해 사과드립니다. 나는 당신의 제안을 시도했으나 효과가 없었습니다. 두 URL 슬러그에 관한 것입니다. 하지만 앨범별로 카테고리에 대해 M2M을 사용했기 때문에 단일 앨범에 여러 개의 URL (좋지 않음)이있을 수 있다는 점을 감안할 때 각 URL마다 다른 슬러그를 하나만 사용하여 해결할 수있었습니다. 감사. – thiagobrez

+0

당신은 오신 것을 환영합니다. 내 프로젝트 중 하나에서 이러한 접근 방식은 잘 작동하지만 확실하게 다르게 구현 될 수 있습니다. 다행히 다른 해결책을 찾았습니다! –

관련 문제