【发布时间】: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>
我尝试了以下方法:
- 检查错别字
- 通过添加“/”作为后缀更改了 urls.py
- 删除了 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。