#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">
— с/
beforeprofile
. Переход на/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'),