首页 > 解决方案 > NoReverseMatch 错误参数未找到,Django 新手

问题描述

问候各位程序员,

所以我是一个新手,在这里发布问题,以及一般的 Django,并为此编码,所以寻找建设性的批评。我正在 Django 上构建我的第一个从头开始的应用程序,一个火种克隆。我选择使用自定义模型,这有点痛苦,但我想自定义注册,所以我选择了它。我被困在某个地方,我不确定发生了什么。我查看了类似的帖子并尝试了不同的解决方案,但它不起作用。我得到的错误是, 没有找到带有参数'('',)'的'profile'的反向。尝试了 1 种模式:['profile/(?P[0-9]+)/$']

我不明白为什么将 profile.id 放在我的 url href 标记中时没有传递它。

这是我的根 url.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('dating_app.urls')),


] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

这是约会应用程序/urls.py

from django.urls import path
from django.contrib.auth.views import LoginView
from . import views 


app_name = 'dating_app'
urlpatterns = [
#Home page
    path('', views.home, name='home'),
#List of profiles
    path('profiles/', views.profiles, name='profiles'),
#Individual profiles
    path('profile/<int:profile_id>/', views.profile, name='profile'),


#Login page
    path('login/', LoginView.as_view(template_name = 'dating_app/login.html'), name='login'),
    #Logout page
    path('logout/', views.logout_view, name='logout'),
    #Registration page 
    path('register/', views.register, name='register'),


]

这是约会应用程序/views.py

def profile(request, profile_id):
    """show a single profile"""
    profile = get_object_or_404(Profile,id=profile_id)
    context = {'profile' : profile}
    return render(request, 'dating_app/profile.html', context)


def register(request):
    #Register a new user
    context = {}

    if request.POST:
        form = RegistrationForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            email = form.cleaned_data.get("email")
            description = form.cleaned_data.get("description")
            photo = form.cleaned_data.get("photo")
            raw_password = form.cleaned_data.get('password1')
            profile = authenticate(username=username,email=email,description=description, photo=photo, password=raw_password)
            login(request, profile)
            return redirect ('dating_app:home')
        else:
            context['registration_form'] = form
    else: #get request 
        form = RegistrationForm()
        context['registration_form'] = form
    return render(request, 'dating_app/register.html', context)

我在 base.html 中的 href 标记

<a href="{% url 'dating_app:profile' profile.id %}">My Profile</a>

约会应用程序/register.html

{% extends "dating_app/base.html" %}

{% block content %}

<h1>Register</h1>


    <form method="post" action="{% url 'dating_app:register' profile.id %}" enctype="multipart/form-data">
        {% csrf_token %}
        {% for field in registration_form %}
            <p>
                {{field.label_tag}}
                {{field}}

                {% if field.help_text %}
                    <small style="color:grey;">{{field.help_text}}</small>
                {% endif %}

                {% for error in field.errors %}
                    <p style="color: red;">{{error}}"</p>
                {% endfor %}
            </p>
        {% endfor %}
        <button type="submit">Register</button>
    </form>


{% endblock content %}

如果需要,这是我创建自定义用户的 models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager




class ProfileManager(BaseUserManager):



    def create_user(self, username, email,description,photo, password=None):
        if not email:
            raise ValueError("You must creat an email")
        if not username:
            raise ValueError("You must create a username!")
        if not description:
            raise ValueError("You must write a description")
        if not photo:
            raise ValueError("You must upload a photo")

        user = self.model(
                email=self.normalize_email(email),
                username = username, 
                description= description,
                photo= photo,

            )

        user.set_password(password)
        user.save(using=self._db)
        return user 


    def create_superuser(self, username, email,description,photo, password):
        user = self.create_user(
                email=self.normalize_email(email),
                password=password,
                username=username,
                description=description,
                photo=photo,

            )

        user.is_admin=True
        user.is_staff=True
        user.is_superuser=True
        user.save(using=self._db)
        return user




class Profile(AbstractBaseUser):

    email                       = models.EmailField(verbose_name="email")
    username                    = models.CharField(max_length=30, unique=True)
    date_joined                 = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login                  = models.DateTimeField(verbose_name='last login', auto_now=True)
    is_admin                    = models.BooleanField(default=False)
    is_active                   = models.BooleanField(default=True)
    is_staff                    = models.BooleanField(default=False)
    is_superuser                = models.BooleanField(default=False)
    #what I added
    description                 = models.TextField()
    photo                       = models.ImageField(upload_to='profile_photo',blank=False, height_field=None, width_field=None, max_length=100)


    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['description','photo','email']


    objects = ProfileManager()


    def __str__(self):
        return self.username


    def has_perm(self, perm, obj=None):
        return self.is_admin


    def has_module_perms(self,app_label):
        return True

提前非常感谢!

标签: pythondjangodjango-modelsdjango-viewsdjango-templates

解决方案


据我所知,您没有profile在上下文中命名的值。由于您的Profile模型用于authentication,因此您应该能够通过user模板中的属性获取它。但是除非您登录,否则它将无法正常工作。所以试试这样:

{% if user.is_authenticated %}
    <a href="{% url 'dating_app:profile' user.id %}">My Profile</a>
{% else %}
    You are not logged in
{% end %}

此外,您需要将操作网址更改为:

<form method="post" action="{% url 'dating_app:register' profile.id %}"

<form method="post" action="{% url 'dating_app:register' %}"

由于registerurl 不带任何参数(来自您的 urls path('register/', views.register, name='register'),)。


推荐阅读