【问题标题】:NoReverseMatch at / - not understanding reasonNoReverseMatch at / - 不理解原因
【发布时间】:2022-11-02 01:13:42
【问题描述】:

我正在尝试在我的导航栏中创建一个“编辑设置/查看个人资料页面”下拉项目。该功能在从下拉列表调用之前正在工作,现在抛出 NoReverseMatch 错误,如下所示:

未找到带有参数 '('',)' 的 'show_profile_page' 的反向操作。尝试了 1 种模式:['subs/(?P[0-9]+)/profile/\Z']

我很难理解为什么当我在其他模板中调用此 url 时会出现此错误,但现在我尝试将其放入下拉列表中,我得到了这个。我应该在views.py 中进行反向调用吗?将不胜感激任何指针...

**urls.py **(订阅应用程序)

from django.urls import path 
from .views import UserRegisterView, UserEditView, PasswordsChangeView, ShowProfilePageView, EditProfilePageView
#from django.contrib.auth import views as auth_views
from . import views

urlpatterns = [
    path('register/', UserRegisterView.as_view(), name='register'),
    path('edit_profile/', UserEditView.as_view(), name='edit_profile'),
    #path('password/', auth_views.PasswordChangeView.as_view(template_name='registration/change-password.html')),
    path('password/', PasswordsChangeView.as_view(template_name='registration/change-password.html')),
    path('password_success', views.password_success, name="password_success"),
    path('<int:pk>/profile/', ShowProfilePageView.as_view(), name="show_profile_page"),
    path('<int:pk>/edit_profile_page/', EditProfilePageView.as_view(), name="edit_profile_page")
]
from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from django.urls import reverse
from datetime import datetime, date
from ckeditor.fields import RichTextField
# Create your models here.


class Post(models.Model):
    title = models.CharField(max_length=255)
    title_tag = models.CharField(max_length=255)
    header_image = models.ImageField(null=True, blank=True, upload_to="images/")
    description = models.CharField(max_length=50)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = RichTextField(blank=True, null=True)
    #body = models.TextField()
    timestamp = models.DateField(auto_now_add=True)
    category = models.CharField(max_length=255, default='News')
    likes = models.ManyToManyField(User, related_name='post_user')

    def total_likes(self):
        return self.likes.count()

    #return title on admin panel
    def __str__(self):
        return self.title + ' | ' + str(self.author)

    def get_absolute_url(self):
        return reverse('home')


class Category(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('home')


class Profile(models.Model):
    user = models.OneToOneField(User, null=True, on_delete=models.CASCADE)
    bio = models.TextField()
    profile_pic = models.ImageField(null=True, blank=True, upload_to="images/profile")
    site_url = models.CharField(max_length=255, null=True, blank=True)
    facebook_url = models.CharField(max_length=255, null=True, blank=True)
    instagram_url = models.CharField(max_length=255, null=True, blank=True)

    def __str__(self):
        return str(self.user)

视图.py(子应用程序)

from django.shortcuts import render, get_object_or_404
from django.views import generic
from django.views.generic import DetailView
from django.contrib.auth.forms import UserCreationForm, UserChangeForm, PasswordChangeForm
from django.urls import reverse_lazy
from .forms import SignUpForms, EditProfileForm, PasswordUpdateForm
from django.contrib.auth.views import PasswordChangeView
from nooz2.models import Profile
# Create your views here.


class UserRegisterView(generic.CreateView):
    form_class = SignUpForms
    template_name = 'registration/register.html'
    success_url = reverse_lazy('login')


class UserEditView(generic.UpdateView):
    form_class = EditProfileForm
    template_name = 'registration/edit_profile.html'
    success_url = reverse_lazy('home')

    def get_object(self):
        return self.request.user


class PasswordsChangeView(PasswordChangeView):
    form_class = PasswordUpdateForm
    #form_class = PasswordChangeForm
    success_url = reverse_lazy('password_success')

def password_success(request):
    return render(request, 'registration/password_success.html', {})


class ShowProfilePageView(DetailView):
    model = Profile
    template_name = 'registration/user_profile.html'

    def get_context_data(self, *args, **kwargs):
        #users = Profile.objects.all()
        context = super(ShowProfilePageView, self).get_context_data(*args, **kwargs)
        
        page_user = get_object_or_404(Profile, id=self.kwargs['pk'])
        
        context["page_user"] = page_user
        return context


class EditProfilePageView(generic.UpdateView):
        model = Profile
        template_name = 'registration/edit_profile_page.html'
        fields = ['bio', 'profile_pic', 'site_url', 'facebook_url', 'instagram_url']
        success_url = reverse_lazy('home')

导航栏.html

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="container-fluid">
      <a class="navbar-brand" href="{% url 'home' %}">Nooz</a>
      <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse" id="navbarNavDropdown">
        <ul class="navbar-nav">
          <!-- Dropdown code for categories -->
          {% if category_menu %}
          <li class="nav-item dropdown">
            <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
              Categories
            </a>
            <ul class="dropdown-menu">
              <!-- generates list of categories -->
              {% for item in category_menu %}
              <li><a class="dropdown-item" href="{% url 'category' item|slugify|title %}">{{ item }}</a></li>
              {% endfor %}
            </ul>
          </li>
          {% endif %}

          {% if user.is_authenticated %}
          <li class="nav-item">
            <a class="nav-link" href="{% url 'new_post' %}">Add Post</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="{% url 'add_category' %}">Add Category</a>
          </li>
          
          <li class="nav-item dropdown">  
            <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
              Profile
            </a>
            <ul class="dropdown-menu dropdown-menu-dark">
              <li><a class="nav-link dropdown-item" href="{% url 'edit_profile' %}">Settings</a></li>
              <li><a class="nav-link dropdown-item" href="{% url 'show_profile_page' user.profile.id %}">View Profile Page</a></li>
              <li><a class="nav-link dropdown-item" href="{% url 'edit_profile_page' user.profile.id %}">Edit Profile Page</a></li>
              <li><a class="nav-link dropdown-item" href="{% url 'logout' %}">Logout</a></li>
            </ul>
          </li>
          
        {% else %}
          <li class="nav-item">
            <a class="nav-link" href="{% url 'register' %}">Register</a>
          </li>
          <li class="nav-item">
            <a class="nav-link" href="{% url 'login' %}">Login</a>
          </li>
        {% endif %}
        </ul>
      </div>
    </div>
  </nav>

我尝试了以下方法:

  1. 检查错别字
  2. 通过添加“/”作为后缀更改了 urls.py
  3. 删除了 user.profile.id 以查看是否引发错误

【问题讨论】:

  • user.profile.id 来自哪里?
  • 根据您的错误消息,user.profile.id 似乎传递的是一个空字符串,而不是反向匹配所期望的 int。您能否分享您链接到 User 的配置文件模型并确保它具有有效值?同样关于您的最后一点,删除 user.profile.id 仍然会引发错误,因为需要一个 int 。
  • @shriakhilc 添加了我的 models.py。
  • @SunderamDubey 添加了 models.py
  • 0 注意:因为我一直在搞乱,我发现如果我只用一个整数替换“user.profile.id”作为参数,比如这个显示配置文件页面,它会让我转到该页面,然后让我去到表格并填写它,一切正常,但显然这不起作用,因为它将表格内容发送到那里列出的任何 id,而不是适当的 id。

标签: python django


【解决方案1】:

如果没有forms.py,我无法给你一个代码示例,但我怀疑如果你在管理面板中创建了一个Profile 对象,它会解决这个问题。如果您不确定如何在管理面板中注册您的 Profile 模型,那么可以在此处的文档中找到一个简单的示例:

https://docs.djangoproject.com/en/4.1/ref/contrib/admin/#modeladmin-objects

简单的创建OneToOne关系并不会自动创建对象,还需要在后台自动创建Profile对象。或者,如果用户必须提供信息才能拥有Profile,那么用户将通过适当的用户旅程,以确保他们在看到与其个人资料页面具有反向 URL 的页面之前创建一个页面(使用我的个人资料没有)

您可以通过在模板中添加调试详细信息来测试它

<h1>{{ user.profile.id|default:"Does not exist" }}</h1>

在适当的地方,我想它将是None 并且还注释掉与用户个人资料相反的url。

templatecis 中发生的情况是,由于配置文件对象不存在,如果您尝试访问 shell 中的同一对象或某些视图代码,django 会优雅地忽略通常会引发DoesNotExist 错误的内容。

【讨论】:

    猜你喜欢
    • 2019-02-07
    • 2017-09-10
    • 2020-06-01
    • 2017-08-19
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多