Создание нового пользователя в проекте django не работает должным образом

#python #django

#python #django

Вопрос:

Я пытаюсь создать пользовательский проект, в котором пользователи могут создавать профиль. После регистрации пользователь создается в серверной части, но возвращает ошибку:

 Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/accounts/profile/
  

Пользователь вошел в систему, но я не знаю причину и как исправить эту ошибку.
Вот модели:

 class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.user.username} Profile'
  

вот views.py:

 def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            messages.success(request, f'Your account has been created! You are now able to log in')
            return redirect('login')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})


@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST,
                                   request.FILES,
                                   instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(request, f'Your account has been updated!')
            return redirect('profile')

    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile)

    context = {
        'u_form': u_form,
        'p_form': p_form
    }

    return render(request, 'users/profile.html', context)
  

Вот urls.py в основном проекте:

 
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('post.urls')),
    path('register/', user_views.register, name='register'),
    path('profile/', user_views.profile, name='profile'),
    path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
    path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
    path('password-reset............)
]
  

вот шаблон:

 {% extends "post/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
        <form action="profile" method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Join Today</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Sign Up</button>
            </div>
        </form>
        <div class="border-top pt-3">
            <small class="text-muted">
                Already Have An Account? <a class="ml-2" href="{% url 'login' %}">Sign In</a>
            </small>
        </div>
    </div>
{% endblock content %}
  

В чем причина направления Request URL: http://127.0.0.1:8000/accounts/profile/ и как это исправить?

Ответ №1:

В вашей форме ваш action должен быть:

 <form action="/profile/" method="POST">
  

и не

 <form action="profile/" method="POST">
  

также это не должно быть

 <form action="profile" method="POST">
  

Он не перенаправляет на правильный адрес без косой черты / перед адресом действия, потому что он использует вашу текущую страницу в качестве базового URL, когда / не указан.

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

1. @dmitryo привет, я добавил действие, но все равно ничего не произошло. Это та форма, на которую вы ссылаетесь?

2. @Shiko Ваш базовый URL-адрес должен быть http://127.0.0.1:8000 , не http://127.0.0.1:8000/accounts , поэтому, если ваши пути правильно настроены, вы не должны нажимать http://127.0.0.1:8000/accounts — это должно быть <form action="/profile" method="POST"> , не <form action="profile" method="POST"> — с / before profile . Переход на /accounts/profile происходит потому, что вы находитесь на странице с адресом /accounts в то время, когда вы отправляете свою форму, поэтому вам это нужно /profile , чтобы предотвратить это.

Ответ №2:

Поскольку отображается ошибка

 Request URL:    http://127.0.0.1:8000/accounts/profile/
  

тогда он, вероятно, ищет URL-адрес в этом месте.

В вашей конфигурации URL он записывается как:

     path('profile/', user_views.profile, name='profile'),
  

Поэтому я бы рекомендовал попробовать добавить учетную запись:

     path('accounts/profile/', user_views.profile, name='profile'),