2015-05-07 2 views
1

Как работает {"% url 'news_id' %"}? У меня есть шаблон url url(r'^((?:\w|-)+)/$', 'comments.views.home', name='news_id'), но я все еще получаю NoReverseMatch.Как работает шаблон шаблона URL-адреса Django?

Это говорит

Reverse для 'news_id' с аргументами '()' и именованных аргументов '{}' не найден. 1 образец (s) попробовал: [ '((?: \ Ш | -) +)/$']

views.py

from django.shortcuts import render 
from comments.models import User 
from django.http import HttpResponseRedirect, HttpResponse 
from django.template import RequestContext, loader, Context 
from comments.models import News, User, Comment 
from django.core.urlresolvers import resolve 

def home(request, url_arg): 
    print "in Views.py", "and url_arg = ", url_arg 
    c = Comment.objects.all().filter(news__news_id=url_arg) 
    n = News.objects.all().get(news_id=url_arg) 
    cont = Context({'news': n.text, 'cts': c, 'news_id': n.news_id}) 
    rc = RequestContext(request, cont) 
    t = loader.get_template('home.html') 
    print 'n = ', n 
    return HttpResponse(t.render(rc)) 
    return render(request, 'home.html', context_dict, context_instance=RequestContext(request)) 

def submit(request): 
    print "request.path_info = ", request.path_info 
    print "in submit method and url = ", resolve(request.path_info).url_name, " & other try = ", request.resolver_match.url_name 
    news_id = request.POST.get('news_id') 
    user_id = request.POST.get('user_id') 
    comment_text = request.POST.get('comment') 
    print "news_id =", news_id, "user_id = ", user_id, "comment_text = ", comment_text 
    n = News(news_id=news_id) 
    n.save() 
    u = User(name='random',user_id=user_id) 
    u.save() 
    c = Comment(news=n, user=u, text=comment_text) 
    c.save() 
    return HttpResponse("Thanks!") 

urls.py

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

urlpatterns = [ 
    # Examples: 
    url(r'^(?:\w|-)+/submit/$','comments.views.submit'), 
    url(r'^((?:\w|-)+)/$', 'comments.views.home', name='news_id'), 
    # url(r'^blog/', include('blog.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
] 

home.html

<p> 
    News: {{news}}<br> 
    </p> 
    <form action="{% url news_id %}" method="post"> {% csrf_token %} 
    User Id: <input type="text" name="user_id"> <br> 
    Comment:<br> 
    <input type="text" name="comment" placeholder="Express your opinion ..."> 
    <input type="submit" value="Submit"> <br> 

    {% for ct in cts %} 
    {{ ct.text }}<br> 
    {% endfor %} 

</form> 
+0

Возможно, если вы разместите views.py, некоторые html, urls.py, это даст вам более ясную проблему. – Trix

ответ

3

Вы неправильно поняли несколько вещей здесь. В частности, вы перепутали имя шаблона URL-адреса, а параметры вам необходимо передать.

Например, если вы хотите, чтобы захватить идентификатор пост в своем блоге, и передать его в детальном, вы обычно делаете что-то вроде:

url(r'^(?P<post_id>)/$', views.post_detail, name='post_detail') 

так что название шаблон post_detail и требуемый параметр называется post_id. Таким образом, вы можете отменить это:

{% url "post_detail" post_id=my_post.id %} 

Кроме того, ваше регулярное выражение очень странно. У вас есть группа, не захватывающая захват, как единственное содержимое группы захвата. Я не могу сказать, что вы на самом деле пытаетесь сделать с этим шаблоном, но обычно домашняя страница не принимает никаких параметров вообще, и на самом деле вы фактически не передаете какие-либо параметры. Просто используйте r'^$'.

+0

Извините, для более позднего ответа моя сеть здесь не работала. Второй url '((?: \ W | -) +)' не является не захватывающим. В нем говорится, что они не захватывают отдельное слово, а захватывают целую последовательность слов, связанных с '-'. Первый url '(?: \ W | -) +' не является захватывающим, потому что я хочу, чтобы после того, как текущий URL-адрес похож на 'example.com/news_id', submit должен перенаправить его на пример .com/news_id/submit'. Правильно ли эта логика вам особенно нравится? –

Смежные вопросы