2017-09-04 58 views
0

我已经得到了NoReverse匹配错误,我得到它以盲目的猜测工作。和页面未找到我一直能够修复,所以我真的不知道发生了什么。Django:NoReverse匹配错误和页面未找到

据我可以告诉一切应该正常工作,我甚至比较这个代码和以前的项目,它看起来很好(我一直在修补它,所以它可能不是我最初输入)。

base.html文件

<!DOCTYPE html> 
{% load staticfiles %} 

<html lang="en"> 
    <head> 
     <title>Evverest</title> 

     <meta name"viewport" content="width=device-width, initial-scale=1"> 
     <meta charset="uft-8"> 
     <link rel="shortcut icon" href="/images/favicon.ico"> 
     <link rel="stylesheet" href="{% static 'css/style.css' %}"> 
    </head> 

<body> 

    <nav> 
     <div class="container"> 
      <a class="brand" href="{% url 'index' %}">Evverest</a> 

      <div class="navbar"> 
       <a class="nav-link btn" href="{% url 'index' %}">Home</a> 
       {% if user.is_authenticated %} 
        <a class="nav-link" href="{% url 'users:user-profile' %}">New Color Set</a> 
        <a class="nav-link" href="{% url 'users:user_logout' %}">Logout</a> 
       {% else %} 
        <a class="nav-link" href="{% url 'users:user_login' %}">Login</a> 
        <a class="nav-link" href="{% url 'users:register' %}">Register</a> 
       {% endif %} 
      </div> 
     </div> 
    </nav> 

    <div class="container"> 
     {% block content %} 
     {% endblock %} 
    </div> 

</body> 

</html> 

应用views.py

from django.shortcuts import render 
from users.forms import UserForm,UserProfileForm 
from users.models import UserProfileInfo 

from django.contrib.auth import authenticate,login,logout 
from django.http import HttpResponseRedirect, HttpResponse 
from django.core.urlresolvers import reverse 
from django.contrib.auth.decorators import login_required 

from django.contrib.auth.mixins import LoginRequiredMixin 
from django.views.generic import (TemplateView,ListView, 
            DetailView,CreateView, 
            UpdateView,DeleteView) 

# Create your views here. 
def user_login(request): 
    if request.method == 'POST': 
     username = request.POST.get('username') 
     password = request.POST.get('password') 

     user = authenticate(username=username,password=password) 

     if user: 
      if user.is_active: 
       login(request,user) 
       return HttpResponseRedirect(reverse('index')) 
      else: 
       return HttpResponse("Account now active") 

     else: 
      print("Login Unsuccessful") 
      return HttpResponse("Username and/or password are not correct") 

    else: 
     return render(request,'login.html',{}) 

def register(request): 
    registered = False 

    if request.method == 'POST': 
     user_form = UserForm(data=request.POST) 
     profile_form = UserProfileForm(data=request.POST) 

     if user_form.is_valid() and profile_form.is_valid(): 
      user = user_form.save() 
      user.set_password(user.password) 
      user.save() 

      profile = profile_form.save(commit=False) 
      profile.user = user 

      if 'profile_pic' in request.FILES: 
       profile.profile_pic = request.FILES['profile_pic'] 

      profile.save() 
      registered = True 
     else: 
      print(user_form.errors,profile_form.errors) 
    else: 
     user_form = UserForm() 
     profile_form = UserProfileForm() 

    return render(request,'register.html',{ 
             'user_form':user_form, 
             'profile_form':profile_form, 
             'registered':registered 
             }) 

@login_required 
def user_logout(request): 
    logout(request) 
    return HttpResponseRedirect(reverse('login')) 

class HomeView(ListView): 
    model = UserProfileInfo 
    ordering = ['-join_date'] 

class UserProfileView(DetailView): 
    model = UserProfileInfo 

class UserEditProfileView(LoginRequiredMixin,UpdateView): 
    login_url = '/login/' 
    redirect_field_name = '/users_detail.html' 
    form_class = UserProfileForm 
    model = UserProfileInfo 

项目urls.py

from django.conf.urls import url 
from django.contrib import admin 
from django.conf.urls import include 
from users import views 

urlpatterns = [ 
    url(r'^admin/', admin.site.urls), 
    url(r'^$',views.HomeView.as_view(),name='index'), 
    url(r'^users/',include('users.urls',namespace='users')), 
] 

应用urls.py

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

app_name = 'users' 

urlpatterns = [ 
    url(r'^login/$',views.user_login,name='user_login'), 
    url(r'^logout/$',views.user_logout,name='user_logout',kwargs={'next_page':'/'}), 
    url(r'^register/$',views.register,name='register'), 
    url(r'(?P<username>\d+)/$',views.UserProfileView.as_view(),name='user-profile'), 
    url(r'(?P<username>\d+)/edit$',views.UserEditProfileView.as_view(),name='user-profile-edit'), 
] 

文件结构:

enter image description here

编辑 这里是回溯: enter image description here

+0

你可以发布错误的完整堆栈跟踪,以查看哪个url导致它? – wencakisa

+0

您可能需要将kwargs添加到'url'标记。例如'{%url'用户:user-profile'username = user.username%}' –

+2

另外,你的网址格式是用户名是'\ d +',这只是数字 - 你可能需要将其调整为'\ w + ' – karthikr

回答

0

想通了:上来的问题,因为在另一个模板(我没有职位,因为我不知道它有在这个任何影响)我没有把在命名空间users

下面是其他的模板:

{% extends "base.html" %} 

{% block content %} 

<div class="form-base"> 
    <h2>Login</h2> 
    <form action="{% url 'users:user_login' %}" method="POST"> 
     {% csrf_token %} 
     <label for="username">Username: </label> 
     <input type="text" class="login-input" name="username" placeholder="Enter Username" /> 

     <label for="password">Password: </label> 
     <input type="password" class="login-input" name="password" /> 

     <input type="submit" name="" value="Login" /> 
    </form> 
</div> 

{% endblock %} 

谢谢大家的帮助。

0

,正如你在urls.py看到:

url(r'(?P<username>\d+)/$',views.UserProfileView.as_view(),name='user-profile') 

user-profile网址需要一个参数,这是username。但是,在您的模板,你不要把它传递:

<a class="nav-link" href="{% url 'users:user-profile' %}">New Color Set</a> 

所以Django不知道通过哪个用户名,这将导致NoReverseMatch

你只需要到username传递给url:

<a class="nav-link" href="{% url 'users:user-profile' username=user.username %}">New Color Set</a> 
+0

但是还没有任何用户名。在发布之前,我能够简单地工作,然后我切换了一些东西,但它停止工作了。 – Garrett

+0

@Garrett由于您的“home”不是由'login_required'装饰的,所以您可能会遇到没有'user'的情况。在你的情况下。我猜你可以在需要用户参数的菜单条目周围放置一个“if”块,以便隐藏链接到配置文件的菜单条目,如果用户未经过认证:'{%if not user.is_authenticated%} ...{%endif%}'。但根据你的'urls.py','users:user-profile'视图需要一个用户名参数,所以它是强制性的,没有争议的地方:'r'(?P \ d +)/ $''。 –

+0

试过,仍然不确定。追加了追溯。 – Garrett