2016-12-19 8 views
-1

я застрял на этой ошибке Django на некоторое время:Позиционных Аргументы withDjango URL шаблоны

учебники() недостающие 1 необходимых позиционной аргумент: 'tutorial_id'

Ниже перечислены файлы. Использование Python 3.5 и Django 1.10.

учебники/urls.py:

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

app_name = 'tutorials' 

urlpatterns = [ 
    url(r'^(?P<tutorial_id>[0-9]+)/$', views.tutorials, name='tutorials'), 
    url(r'^$', views.tutorials, name='tutorials'), 
] 

учебники/views.py

from django.shortcuts import render, get_object_or_404 
from .models import Tutorial, Lesson 

def tutorials(request, tutorial_id): 
    tutorials = get_object_or_404(Tutorial, pk=tutorial_id) 
    return render(request, 'tutorials/tutorials.html', { 'tutorials': tutorials}) 

Когда я посещаю website.com/tutorials я получаю ошибку, но он будет работать нормально, если я иду website.com/tutorials/1 который хорош. Но я хочу иметь доступ к /tutorials, поэтому я могу указать информацию по этой ссылке.

+0

получить ошибку ссылается на страницу 404? – depperm

+0

Что вы ожидаете/учебники? Вашему представлению нужен идентификатор учебника. Если вы хотите определить URL-адрес, который не принимает этот идентификатор, вам нужно другое представление, которое не нуждается в нем. –

ответ

0

Возможно, вам нужны различные функции, чтобы служить набор учебников и один руководство.

учебники/urls.py

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

app_name = 'tutorials' 

urlpatterns = [ 
    url(r'^(?P<tutorial_id>[0-9]+)/$', views.tutorial_view, name='tutorials'), 
    url(r'^$', views.tutorials_view, name='tutorials'), 
] 

учебники/views.py

from django.shortcuts import render, get_object_or_404 
from .models import Tutorial, Lesson 

def tutorials_view(request): 
    tutorials = Tutorial.objects.all() 
    return render(request, 'tutorials/tutorials.html', { 'tutorials': tutorials}) 

def tutorial_view(request, tutorial_id): 
    tutorial = get_object_or_404(Tutorial, pk=tutorial_id) 
    return render(request, 'tutorials/tutorial.html', { 'tutorial': tutorial}) 

Ваша потребность создать отдельный шаблон для одного вида учебника.

+0

Гвоздь на голову! – Tyler

0

Вам необходимо передать этот аргумент по URL-адресу (1) в шаблоне или присвоить ему значение по умолчанию в views.py (2).

  1. {% URL '' Уроки template.id%}
  2. Защиту учебники (запрос, tutorial_id = 1):
0

Это из-за заказа шаблона url django, просто измените порядок, так как регулярное выражение ^(?P<tutorial_id>[0-9]+)/ соответствует. Варианты:

изменить код для

# tutorials_list is different view to handle list 
urlpatterns = [ 
    url(r'^$', views.tutorials_list, name='tutorials-list'), 
    url(r'^(?P<tutorial_id>[0-9]+)/$', views.tutorials, name='tutorials-detail'), 
] 

или проверить это в виду,

def tutorials(request, *args, **kwargs): 
    tutorial_id = kwargs.get('tutorial_id', None) 
    tutorials = get_object_or_404(Tutorial, pk=tutorial_id) 
    return render(request, 'tutorials/tutorials.html', { 'tutorials': tutorials}) 

с одним URL определенного междунар url_patterns

urlpatterns = [ 
    url(r'^(?P<tutorial_id>[0-9]+)/$', views.tutorials, name='tutorials-detail'), 
] 
+0

Хороший материал. Мне просто нужно было добавить другое представление – Tyler