Аргумент об ошибке NoReverseMatch не найден, Django новичок - PullRequest
0 голосов
/ 12 марта 2020

Привет, коллеги-программисты,

Так что я немного новичок ie, когда я пишу вопросы здесь, а также Django в целом и программирую по этому вопросу, поэтому ищу конструктив критика. Я работаю над созданием своего первого приложения с нуля, клона Tinder, на Django. Я выбрал go с пользовательской моделью, что было довольно сложно, но я хотел настроить регистрацию, поэтому я согласился с ней. Я застрял в определенном месте, где я не уверен, что происходит. Я просмотрел похожие посты и пробовал разные решения, но они не работают. Я получаю сообщение об ошибке: Обратное значение для "профиля" с аргументами "('',)" не найдено. Попробован 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)

Вот Dating_app / 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'),


]

Вот Dating_app / 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)

Мой тег href в базе. html

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

dating_app / 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

Заранее большое спасибо!

1 Ответ

0 голосов
/ 12 марта 2020

Как я понимаю, у вас нет значения с именем 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 %}

Кроме того, вам нужно изменить URL-адрес действия с:

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

На

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

Как register url делает не принимать никаких аргументов (из ваших URL path('register/', views.register, name='register'),).

...