Никогда не сопоставлять в / Reverse для ‘view_profile_with_pk’ с аргументами ключевого слова

#python #django

#python #django

Вопрос:

эта ошибка убивает меня, пожалуйста, помогите, я сидел в течение 3 часов, и я даже не мог понять, почему происходит ошибка, я предоставлю всю необходимую информацию, кстати, я новичок в Django, поэтому, пожалуйста, объясните, если можете, спасибо, ошибка: NoReverseMatch в / Reverse для ‘view_profile_with_pk’ саргументы ключевого слова ‘{‘pk’: «}’ не найдены. попробовано 1 шаблон (ы): [‘учетная запись / профиль /(P(?P [^/] ) \ d ) /$’] Мои URLs .py

 from django.urls import path, include
from . import views
from django.contrib.auth.views import (PasswordResetView , PasswordResetDoneView, PasswordResetConfirmView,
PasswordResetCompleteView)
app_name= 'accounts'
urlpatterns = [
    path('signup/', views.register, name='signup'),
    path('login/', views.login, name='login'),
    path('logout', views.logout, name='logout'),
    path('profile/', views.view_profile, name='view_profile'),
    path('profile/(P<pk>d )/', views.view_profile, name='view_profile_with_pk'),
    path('profile/edit/', views.edit_profile, name='edit_profile'),
    path('change-password/', views.change_password, name='change_password'),

    path('password_reset/', PasswordResetView.as_view(), name='password_reset'),
    path('password_reset/done/', PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('reset/done/',PasswordResetCompleteView.as_view(), name='password_reset_complete'),


]
  

Мой views.py

 from django.shortcuts import render, redirect
from django.contrib.auth.models import User
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.urls import reverse
from accounts.forms import (
    RegistrationForm,
    EditProfileForm,
    UserProfileForm
)

from django.contrib.auth.models import User
from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required


def register(request):
    if request.method =='POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('accounts:home')
    else:
        form = RegistrationForm()

    args = {'form': form}
    return render(request, 'accounts/reg_form.html', args)

def view_profile(request, pk=None):
    if pk:
        user = User.objects.get(pk=pk)
    else:
        user = request.user
    args = {'user': user}
    return render(request, 'accounts/profile.html', args)

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)
        imgF = UserProfileForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            imgF.save()
            return redirect('accounts:view_profile')
    else:
        form = EditProfileForm(instance=request.user)
        imgF = UserProfileForm(instance=request.user)
    args = {'form': form , 'img':imgF}
    return render(request, 'accounts/edit_profile.html', args)

def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
            return redirect('accounts:view_profile')
        else:
            return redirect('accounts:change_password')
    else:
        form = PasswordChangeForm(user=request.user)

    args = {'form': form}
    return render(request, 'accounts/change_password.html', args)
def login(request):
    if request.method == 'POST':
        user = auth.authenticate(username=request.POST['username'],password=request.POST['password'])
        if user is not None:
            auth.login(request, user)
            return redirect('home:home')
        else:
            return render(request, 'accounts/login.html',{'error':'username or password is incorrect.','user':user})
    else:
        return render(request, 'accounts/login.html')

def logout(request):
    if request.method == 'POST':
        auth.logout(request)
        return redirect('home:home')
  

Обратная трассировка:

 Traceback (most recent call last):
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangocorehandlersexception.py", line 47, in inner
    response = get_response(request)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangocorehandlersbase.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangoviewsgenericbase.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangoviewsgenericbase.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "C:UsersdagheDesktopAlone-Osamahomeviews.py", line 26, in get
    return render(request, self.template_name, args)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangoshortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplateloader.py", line 62, in render_to_string
    return template.render(context, request)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebackendsdjango.py", line 61, in render
    return self.template.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 170, in render
    return self._render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
    return self.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplateloader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 162, in _render
    return self.nodelist.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
    return self.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplateloader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 938, in render
    bit = node.render_annotated(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
    return self.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatedefaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatebase.py", line 905, in render_annotated
    return self.render(context)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangotemplatedefaulttags.py", line 446, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangourlsbase.py", line 87, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "C:Usersdagheanaconda3envsenvlibsite-packagesdjangourlsresolvers.py", line 685, in _reverse_with_prefix
    raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /
Exception Value: Reverse for 'view_profile_with_pk' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['account\/profile\/\(P(?P<pk>[^/] )\\d\ \)\/$']
  

profile.html:

 {% extends 'base.html' %}


{% block head %}
<title>Profile</title>
{% endblock %}

{% block content %}
<div class="container">
    <h1>Profile</h1>
    <p>Username: {{ user }}</p>
    <p>First name: {{ user.first_name }}</p>
    <p>Last name: {{ user.last_name }}</p>
    <p>Email: {{ user.email }}</p>
    <p>Description: {{ user.userprofile.description }}</p>
    <p>Phone: {{ user.userprofile.phone }}</p>
    <p>City: {{ user.userprofile.city }}</p>
    <p>Website: {{ user.userprofile.website }}</p>
    {% if user.userprofile.image %}
    <img src="{{ user.userprofile.image.url }}" width="240">
    {% endif %}
</div>

{% endblock %}
  

Base.html

 <!doctype html>
<html lang="en">
<head>
  {% load static %}
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="">
  <meta name="author" content="">


  <title>Osama Daghestani</title>
<link rel="stylesheet" href="{% static 'navstyle.css' %}">
  <!-- Bootstrap core CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA 058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
  <link href="{% static 'open-iconic/font/css/open-iconic-bootstrap.css' %}" rel="stylesheet">
 <link href="{% static 'fontawesome/css/all.css'%}" rel="stylesheet">
  <link rel="apple-touch-icon" sizes="60x60" href="static/Favicon//apple-icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="static/Favicon//apple-icon-72x72.png">
<link rel="apple-touch-icon" sizes="76x76" href="static/Favicon//apple-icon-76x76.png">
<link rel="apple-touch-icon" sizes="114x114" href="static/Favicon//apple-icon-114x114.png">
<link rel="apple-touch-icon" sizes="120x120" href="static/Favicon//apple-icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="static/Favicon//apple-icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="static/Favicon//apple-icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="static/Favicon/apple-icon-180x180.png">
<link rel="icon" type="image/png" sizes="192x192"  href="static/Favicon//android-icon-192x192.png">
<link rel="icon" type="image/png" sizes="32x32" href="static/Favicon//favicon-32x32.png">
<link rel="icon" type="image/png" sizes="96x96" href="static/Favicon//favicon-96x96.png">
<link rel="icon" type="image/png" sizes="16x16" href="static/Favicon//favicon-16x16.png">
<link rel="manifest" href="/manifest.json">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="static/Favicon//ms-icon-144x144.png">
<meta name="theme-color" content="#ffffff">
</head>

<body>

  <header>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
      <a class="navbar-brand" href="{% url 'home:home' %}">
      <img src="{% static 'logo.png' %}" height=30 width=30 class="d-inline-block alighn-top" />
      Osama Daghestani
      </a>
      <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span>
      </button>
      <div class="collapse navbar-collapse " id="navbarNavAltMarkup">
        <div class="navbar-nav ml-auto">
          {% if user.is_authenticated %}
          <a class="nav-item nav-link" href="">Post <i class="fas fa-plus"></i></span></a>
          <div class="nav-item nav-link dropdown">
  <a  id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
    dasdas<img class="UserImage" src="{{ user.userprofile.image.url }}" height="30" width="30"  alt="">
  </a>
  <div class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuButton">
    <a class="dropdown-item" href="{% url 'accounts:view_profile' %}"><i class="fas fa-user"></i> Profile</a>
    <a class="dropdown-item" href="{% url 'accounts:edit_profile' %}"><i class="fas fa-cog"></i> Settings</a>
    <a class="dropdown-item" href="javascript:{document.getElementById('logout').submit()}"onclick=""><i class="fas fa-user-minus"></i> Logout</a>
  </div>
</div>



          <form id="logout" method="POST" action="{% url 'accounts:logout' %}">
            {% csrf_token %}
            <input type="hidden" />
          </form>
          {% else %}
          <a class="nav-item nav-link" href="{% url 'accounts:signup' %}">Sign Up <i class="fas fa-user-plus"></i></a>
          <a class="nav-item nav-link" href="{% url 'accounts:login' %}">Login <i class="fas fa-user"></i></a>
          {% endif %}
        </div>
      </div>



    </nav>
  </header>

  <div class="container">

    {% block content %}
    {% endblock %}

  </div>

  <footer class="text-muted">

    <div class="container text-center">
      <p>©Alone {% now "Y" %} By Osama Daghestani</p>
      </div>

  </footer>

  <!-- Bootstrap core JavaScript
  ================================================== -->
  <!-- Placed at the end of the document so the pages load faster -->

  <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5 76PVCmYl" crossorigin="anonymous"></script>
</body>
</html>
  

Home.html

 {% extends 'base.html' %}

{% block content %}
<div class="container">
    <div class="col-md-8">
        <h2>Home</h2>
        <form method="post">
            {% csrf_token %}
            {{ form.post }}
            <br>
            <button type="submit">Submit</button>
        </form>
        <h2>{{ text }}</h2>
        {% for post in posts %}
            <h1>{{ post.post }}</h1>
            <p>Posted by {{ post.user.get_full_name }} on {{ post.created }}</p>
        {% endfor %}
    </div>
    <div class="col-md-4">
        <h2>Other People</h2>
        {% for user in users %}
            <a href="{% url 'accounts:view_profile_with_pk' pk=user.pk %}">
                <h3>{{ user.username }}</h3>
            </a>
            {% if not user in friends %}
            <a href="{% url 'home:change_friends' operation='add' pk=user.pk %}">
            <button type="button" class="btn btn-success">Add Friend</button>
            </a>
            {% endif %}
        {% endfor %}
        <h2>Friends</h2>
        {% for friend in friends %}
            <a href="{% url 'accounts:view_profile_with_pk' pk=friend.pk %}">
                <h3>{{ friend.username }}</h3>
            </a>
            <a href="{% url 'home:change_friends' operation='remove' pk=friend.pk %}">
            <button type="button" class="btn btn-default">Remove Friend</button>
            </a>
        {% endfor %}
    </div>
</div>
{% endblock %}
  

Models.py:

 from django.db import models
from django.contrib.auth.models import User


class Post(models.Model):
    post = models.CharField(max_length=500)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)


class Friend(models.Model):
    users = models.ManyToManyField(User)
    current_user = models.ForeignKey(User, related_name='owner', null=True, on_delete=models.CASCADE)

    @classmethod
    def make_friend(cls, current_user, new_friend):
        friend, created = cls.objects.get_or_create(
            current_user=current_user
        )
        friend.users.add(new_friend)

    @classmethod
    def lose_friend(cls, current_user, new_friend):
        friend, created = cls.objects.get_or_create(
            current_user=current_user
        )
        friend.users.remove(new_friend)
  

Домашние представления:

 from django.views.generic import TemplateView
from django.shortcuts import render, redirect
from django.contrib.auth.models import User

from home.forms import HomeForm
from home.models import Post, Friend


class HomeView(TemplateView):
    template_name = 'home/home.html'

    def get(self, request):

        form = HomeForm()
        posts = Post.objects.all().order_by('-created')
        users = User.objects.exclude(id=request.users.id)
        if request.user.is_authenticated:
            friend = Friend.objects.get(current_user=request.users)
            friends = friend.users.all()
        else:
            friend=1
            friends=(1,)
        args = {
            'form': form, 'posts': posts, 'users': users, 'friends': friends
        }
        return render(request, self.template_name, args)

    def post(self, request):
        form = HomeForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            post.users = request.users
            post.save()

            text = form.cleaned_data['post']
            form = HomeForm()
            return redirect('home:home')

        args = {'form': form, 'text': text}
        return render(request, self.template_name, args)

def change_friends(request, operation, pk):
    friend = User.objects.get(pk=pk)
    if operation == 'add':
        Friend.make_friend(request.users, friend)
    elif operation == 'remove':
        Friend.lose_friend(request.users, friend)
    return redirect('home:home')
  

Комментарии:

1. Попробовать reverse('accounts:view_profile_with_pk') ?

2. Поделитесь шаблоном, в котором возникает ошибка.

3. Мистер / миссис Виллем Ван Онсем, я поделился им, теперь он называется profile.html

4. Мистер / Миссис Д. Малан, где мне попробовать обратный (‘accounts: view_profile_with_pk’) в views.py ?

5. Можете ли вы также поделиться базовым шаблоном?

Ответ №1:

Теперь я вижу, что вы передаете значение pk, используя {% url 'view_profile_with_pk' pk=user.pk %}

На основе ошибки:

 Exception Value: Reverse for 'view_profile_with_pk' with keyword arguments '{'pk': ''}' not found.
  

Значение pk не передается. Я вижу, что вы используете этот URL-адрес в двух местах вашего home.html файла.

Это наводит меня на мысль user , что либо friend объект or не существует в вашем цикле. Проверьте views.py файл, в котором указан ваш домашний маршрут. Убедитесь, что вы отправляете допустимые переменные для обоих users и friends . Убедитесь, что вы используете users , а не user

Редактировать:

В том views.py , который содержит ваш домашний маршрут, вы создаете переменную, вызываемую friends , если пользователь аутентифицирован, friends содержит всех друзей, принадлежащих пользователю. Однако, если пользователь не прошел проверку подлинности, вы присваиваете friends кортежу friends=(1,) . Этот кортеж не будет иметь значения первичного ключа.

Когда URL пытается передать значение pk, оно будет пустым. Попробуйте изменить значение friends на None , если пользователь не аутентифицирован.

Комментарии:

1. Я добавил свой home.html и, как вы видите, я уже использую этот метод

2. Я вижу это. Используете ли вы get_absolute_url() в своем models.py файл?

3. Я не я добавил свои models .py кстати

4. должен ли я присвоить ему значение 0?

5. но теперь я получаю сообщение об ошибке, которое, я думаю, вам легко решить, можете ли вы мне помочь или вам достаточно скучно?