Форма Django не сохраняется, когда у меня action = нужному url
Если я использую action="" в моей форме django, форма работает правильно, но отправляет пользователя на неправильную страницу. Я хочу, чтобы пользователь возвращался на макрос/страницу после отправки формы, но когда я добавляю url в action (например, action="{% url 'macro' %}"), он переходит на страницу, но форма не сохраняется. Подскажите, как с этим справиться? Код ниже:
(Вариант 1) macro_update.html -> форма здесь работает правильно, но переводит пользователя не на ту страницу
<ul>
<form action="" method="post">
{% csrf_token %}
{{ macro_form.as_ul }}
<input type="submit" value="Submit">
</form>
</ul>
(Вариант 2) macro_update.html -> пользователь перенаправляется на нужную страницу после отправки, но данные формы не обновляются/сохраняются
<ul>
<form action="{% url 'macro' %}" method="post">
{% csrf_token %}
{{ macro_form.as_ul }}
<input type="submit" value="Submit">
</form>
</ul>
views.py
@login_required(login_url='login')
def macroUpdate(request):
if request.method == "POST":
macro_form = MacroForm(request.POST, instance=request.user.profile)
if macro_form.is_valid():
macro_form.save()
messages.success(request,('Your macros were successfully updated!'))
else:
messages.error(request,('Unable to complete request'))
return redirect("profile")
macro_form = MacroForm(instance=request.user.profile)
context = {"user":request.user, "macro_form":macro_form }
return render(request, 'macro_update.html', context)
urls.py
urlpatterns = [
path('', views.loginPage, name='login'),
path('register/', views.registerPage, name='register'),
path('profile/', views.profilePage, name='profile'),
path('profile/update/', views.profileUpdate, name='profile-update'),
path('logout/', views.logoutUser, name='logout-user'),
path('macro/', views.macroPage, name='macro'),
path('macro/update/', views.macroUpdate, name='macro-update'),
]
Я хочу, чтобы пользователь возвращался на макрос/страницу после отправки формы, но когда я добавляю url в action (например, action="{% url 'macro' %}"), он переходит на страницу, но форма не сохраняется.
Потому что данные формы должны попасть в представление macroUpdate
для сохранения, а не macroPage
, для перенаправления на страницу макроса после отправки формы вы можете использовать redirect("macro")
так:
views.py:
@login_required(login_url='login')
def macroUpdate(request):
if request.method == "POST":
macro_form = MacroForm(request.POST, instance=request.user.profile)
if macro_form.is_valid():
macro_form.save()
messages.success(request,('Your macros were successfully updated!'))
else:
messages.error(request,('Unable to complete request'))
return redirect("macro")
macro_form = MacroForm(instance=request.user.profile)
context = {"user":request.user, "macro_form":macro_form }
return render(request, 'macro_update.html', context)
Просто удалите атрибут action
из тега macro_update.html
, поскольку Django всегда берет маршрут текущей страницы, так:
<ul>
<form method="POST">
{% csrf_token %}
{{ macro_form.as_ul }}
<input type="submit" value="Submit">
</form>
</ul>