2015-02-05 5 views
1

Я пытаюсь написать комментарий на странице, а затем перенаправить на страницу У меня есть пустое окно в браузере и [b'<h1>Not Found</h1><p>The requested URL /post/add_comment/test_single_post/ was not found on this server.</p>'] и AssertionError: 404 != 302 в журнале терминала. Я не могу понять, почему страница не найдена (404) в этом случае.Запрашиваемый URL-адрес не найден на этом сервере. Django

вид

class SinglePost(DetailView): 
    model = Post 
    template_name = 'post.html' 

    def get_context_data(self, **kwargs): 
     comment_form = CommentForm 
     context = super(SinglePost, self).get_context_data(**kwargs) 
     comments = Comments.objects.filter(comment_id=self.object).order_by('-added') 
     context['comments'] = comments 
     context['form'] = comment_form 
     return context 


@csrf_protect 
def add_comment(request, slug): 
    """ 
    Add comment to. 
    """ 
    if request.POST: 
     form = CommentForm(request.POST) 
     if form.is_valid(): 
      comment = form.save(commit=False) 
      comment.comment = Post.objects.get(slug=slug) 
      form.save() 
    return redirect('/post/{0}/'.format(slug)) 

URLs

urlpatterns = patterns('', 
    url(r'^post/(?P<slug>\S+)/$', SinglePost.as_view(), 
            name='single_post'), 
    url(r'^tag/(?P<slug>\S+)/$', TagView.as_view(), 
            name='tagger'), 
    url(r'^post/add_comment/(?P<slug>\S+)/$', 
     'blog.views.add_comment', name="commenter"), 
    url(r'^$', PostsList.as_view(), name="all_posts"), 
) 

шаблон

<h3>Comments:</h3> 
{% for comment in comments %} 
    <p>{{ comment.added }} | {{ comment.author }}</p> 
    <p>{{ comment.comment_text }}</p> 
{% empty %} 
    <p>There are no comments here yet. Be first :)</p> 
{% endfor %} 
<form action="/post/add_comment/{{ object.slug }}/" method="POST"> 
    {% csrf_token %} 
    {{ form.non_field_errors }} 
    <div class="fieldWrapper"> 
     {{ form.subject.errors }} 
     <label for="id_author">Add your name:</label><br> 
     {{ form.author|addclass:"form-control" }} 
     <br/> 
     <label for="id_comment_text">Add your comment here:</label><br> 
     {{ form.comment_text|addclass:'form-control comment-textarea' }} 
    </div> 
    <br> 
    <input type="submit" value="Add comment" class="btn btn-primary"> 
</form> 

Может кто-нибудь дать мне ответ, как решить эту проблему?

ответ

2

single_post regex ловит все URL-адреса, начинающиеся с 'post /'. Поместите этот адрес в конце моделей:

urlpatterns = patterns('', 
    url(r'^tag/(?P<slug>\S+)/$', TagView.as_view(), 
            name='tagger'), 
    url(r'^post/add_comment/(?P<slug>\S+)/$', 
     'blog.views.add_comment', name="commenter"), 
    url(r'^$', PostsList.as_view(), name="all_posts"), 
    url(r'^post/(?P<slug>\S+)/$', SinglePost.as_view(), 
            name='single_post'), 
) 

Или, как более правильное решение, изменить \S+ регулярное выражение действительного пробкового регулярное выражение [\w-]+:

urlpatterns = patterns('', 
    url(r'^post/(?P<slug>[\w-]+)/$', SinglePost.as_view(), 
            name='single_post'), 
    url(r'^tag/(?P<slug>[\w-]+)/$', TagView.as_view(), 
            name='tagger'), 
    url(r'^post/add_comment/(?P<slug>[\w-]+)/$', 
     'blog.views.add_comment', name="commenter"), 
    url(r'^$', PostsList.as_view(), name="all_posts"), 
) 
+0

Еще раз спасибо, catavaran. Это мое отсутствие ума. – jwshadow

0

У вас есть два регулярных выражения, которые накладываются друг на друга :

url(r'^post/(?P<slug>\S+)/$', SinglePost.as_view(), 
           name='single_post'), 
[...] 
url(r'^post/add_comment/(?P<slug>\S+)/$', 

Вы должны изменить первый, чтобы быть менее жадными, например: r'^post/(?P<slug>[^/]+)/$' или поместить его в конце.

+0

спасибо, Клаус Д. – jwshadow

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