#django #django-forms
#django #django-forms
Вопрос:
У меня есть это:
def profile(request, username):
if request.method == 'POST':
if request.user.is_authenticated():
new_message = Message(author = request.user)
form = MessagesForm(request.POST, instance = new_message)
else:
form = MessagesForm(request.POST)
if form.is_valid():
form.save()
else:
to_user = User.objects.get(username = username)
form = MessagesForm(initial = {'user': to_user.pk})
return render(request, "profile.html", {
'username': username,
'form': form,
'messages': messages,
})
Эта форма отправляет сообщение и возвращает ту же страницу. Моя проблема в том, что после отправки я снова вижу свое поле, заполненное моей информацией. Как очистить его после отправки?
Ответ №1:
После сохранения формы вместо отображения post dict назначьте пустую форму
form = EmployeeForm()
if request.method == "POST":
pDict = request.POST.copy()
form = EmployeeForm(pDict) #if not valid shows error with previous post values in corresponding field
if form.is_valid():
form.save()
form = EmployeeForm() # show empty form no need to give HttpResponseRedirect()
Комментарии:
1. Это должно быть ответом на вопрос
2. На самом деле нажатие клавиши F5 или перезагрузка страницы отправит ранее отправленные данные, а не пустую форму. Таким образом, перенаправление на другой URL-адрес — лучший выход.
3. перенаправление страницы в большинстве случаев не будет хорошим вариантом.
Ответ №2:
Перенаправление после отправки формы является стандартным для предотвращения дубликатов.
Просто верните перенаправление на вашу форму в случае успеха.
if form.is_valid():
form.save()
return http.HttpResponseRedirect('')
Комментарии:
1. Почему, если я не могу сделать перенаправление? — Форма как плагин для сайта в Django-CMS. Есть ли другой способ?
2. @robos85, не уверен, что ты здесь имеешь в виду. Если вы не делаете это через django, то сделайте это на стороне клиента.
3. Я знаю, что это старый. Но когда я пытаюсь использовать
HttpResponseRedirect('')
, я получаю пустую белую страницу после отправки. Однако форма успешно отправлена. Я на Django 1.114. @Valachio вы случайно возвращаете
HttpResponse('')
(пустую страницу?) Кроме того, убедитесь, что вы указали URL, на который хотите перенаправить. Возможно, ваше представление для обработки POST является строго обработчиком post, и перенаправление само по себе ничего не показывает. ВозвратHttpResponseRedirect('')
перенаправляет вас на ту же страницу.5. Я получаю то же поведение, что и @Valachio при возврате
HttpResponseRedirect('')
с Django 2.2.2. Представление — это не просто обработчик POST.
Ответ №3:
после сохранения() вы можете вернуть ключ ‘form’ с MessagesForm(запрос.ПОЛУЧИТЬ) значение.
return render(request, "profile.html", {
'username': username,
'form': MessagesForm(request.GET),
'messages': messages,
})
Ответ №4:
Обычно вы можете инициализировать ту же пустую форму после сохранения данных:
if request.method == "POST":
rf = RegistrationForm(request.POST)
if rf.is_valid():
print 'Saving datas..'
#logic to save datas
rf = PreRegistrationForm()
return render_to_response('registration/confirmation_required.html', {'settings': settings}, context_instance=RequestContext(request))
Комментарии:
1. На самом деле нажатие клавиши F5 или перезагрузка страницы отправит ранее отправленные данные, а не пустую форму. Таким образом, перенаправление на другой URL-адрес — лучший выход.
Ответ №5:
Попробуйте использовать HttpResponseRedirect('/')
вместо HttpResponseRedirect('')
в ответе @Karthikkumar, особенно если ваш домашний просмотр представляет собой пустой путь, например, у вас в вашем urls.py файл:
urlpatterns = [path('',views.home_view),]
У меня были похожие проблемы, описанные выше, когда HttpResponseRedirect('')
меня перенаправили на пустую страницу. Дайте мне знать, подходит ли вам добавление косой черты!
Ответ №6:
Вы можете использовать это:
Sometimes you can use this idea take attrs={ "autocomplete":"off"} for each inputs.
Комментарии:
1. Не просто добавляйте ответ, попробуйте объяснить свой ответ, чтобы другие поняли ваше решение
Ответ №7:
Вы можете перенаправить обратно к исходному сообщению
post_url = request.build_absolute_uri(post.get_absolute_url())
return HttpResponseRedirect(post_url)
пожалуйста, обратите внимание, что ‘post’ — это экземпляр созданной модели
Ответ №8:
Я надеюсь, вы уже определили логику для методов GET. В случае, если у вас есть, все, что вы можете сделать, это просто добавить запрос return .META[‘HTTP_REFERER’] в конце.
Понимаете, что я имею в виду:
def profile(request, username):
if request.method == 'POST':
if request.user.is_authenticated():
new_message = Message(author = request.user)
form = MessagesForm(request.POST, instance = new_message)
else:
form = MessagesForm(request.POST)
if form.is_valid():
form.save()
else:
to_user = User.objects.get(username = username)
form = MessagesForm(initial = {'user': to_user.pk})
return HttpResponseRedirect(request.META['HTTP_REFERER'])
Это должно сработать, я только что протестировал это.
Ответ №9:
** Возможно, я опоздал, но для Django 4.x разработчики могут использовать: **
from .forms import TodoForm
from django.contrib import messages
from django.http import HttpResponseRedirect
def mytodos(request):
form = TodoForm()
if request.method =='POST':
form=TodoForm(request.POST)
if form.is_valid:
form.save()
messages.success(request,'Task saved successfully')
return HttpResponseRedirect('/todo/')
mycontext={'form':form}
return render(request, 'todo/todo.html',mycontext)
в моем urls.py : , я установил path('todo/',views.mytodo, name='todolist')
Как вы можете видеть, после сохранения формы mycode перенаправит на /todo /, который автоматически обновляется после каждой отправки, и каждый раз появляется новая форма. Если вы хороший разработчик django, вы поймете, что я сделал. Обязательно ответьте, если у вас есть какие-либо вопросы.Спасибо 🙂
Ответ №10:
Когда мы перезагружаем страницу (F5 or ctrl shift R)
, она отправляет ранее отправленные данные. таким образом, вместо обновления мы напрямую перейдем по URL, используя return HttpResponseRedirect('/posts/')
Таким образом, будет отображаться страница с пустой формой (теперь, даже если вы обновите ее, будут отображаться только данные, предыдущие данные повторно отправляться не будут)
from django.shortcuts import render, HttpResponseRedirect
from django.views import View
from .models import Post
from .forms import PostForm
class PostListView(View):
def post(self, request, *args, **kwargs):
posts = Post.objects.filter(author=request.user).order_by('-created_on')
form = PostForm(request.POST)
if form.is_valid():
new_post = form.save(commit=False)
new_post.author = request.user
new_post.save()
return HttpResponseRedirect('/posts/')
context = {
'post_list': posts,
'form': form
}
return render(request, 'social/post_list.html', context)