如何在 Django FormView 中使用 get_success_url() 发送成功消息
How to send a success message with get_success_url() in Django FormView
如果表单有效,我会 FormView
重定向到上一页。这很好用,但我如何告诉用户信息已发布?我希望他在重定向后在模态 window 中看到一条成功消息。
我已经尝试通过 request.session
在 get_success_url
中做到这一点,但它不符合我的目标,因为用户可以多次提交表单。那么我如何 return 任何在 get_success_url
中重定向到 FormView
的消息?
我的FormView
class CatPhotoUploadFormView(FormView):
template_name = 'blank.html'
form_class = CatPhotoForm
def get_success_url(self):
self.request.session['success_message'] = 'Everything is fine'
return reverse('cat:detail_cat', args=(self.kwargs['pk'],))
def form_valid(self, form):
cat = Cat.objects.filter(id__exact=self.kwargs['pk'])
for each in form.cleaned_data['attachments']:
print('****', each, '****', type(each))
Photo.objects.create(photo_path=each, photo_author=self.request.user, photo_cat = cat[0])
return super(CatPhotoUploadFormView, self).form_valid(form)
为此使用 Django 消息传递框架,将 get_success_url
更改为消息。
from django.contrib import messages
def get_success_url(self):
messages.add_message(self.request, messages.INFO, 'form submission success')
return reverse('cat:detail_cat', args=(self.kwargs['pk'],))
在您的模板中,类似这样的内容(注意:记得传递消息)
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
事实上,Django 有一个现成的 mixin,SuccessMessageMixin,可以在基于 class 的视图中使用,以达到相同的目的。
像这样:
from django.contrib.messages.views import SuccessMessageMixin
class CatPhotoUploadFormView(SuccessMessageMixin, FormView):
template_name = 'blank.html'
form_class = CatPhotoForm
success_message = 'Everything is fine'
...
非常干净直接。
def get_success_url(self):
from django.contrib import messages
messages.success(self.request, 'Yes it works!')
这将完成工作
def form_valid(self, form):
print(self.request.POST)
form.save()
messages.add_message(
self.request,
messages.SUCCESS,
'User registered sucessfully'
)
return super().form_valid(form)
如果表单有效,我会 FormView
重定向到上一页。这很好用,但我如何告诉用户信息已发布?我希望他在重定向后在模态 window 中看到一条成功消息。
我已经尝试通过 request.session
在 get_success_url
中做到这一点,但它不符合我的目标,因为用户可以多次提交表单。那么我如何 return 任何在 get_success_url
中重定向到 FormView
的消息?
我的FormView
class CatPhotoUploadFormView(FormView):
template_name = 'blank.html'
form_class = CatPhotoForm
def get_success_url(self):
self.request.session['success_message'] = 'Everything is fine'
return reverse('cat:detail_cat', args=(self.kwargs['pk'],))
def form_valid(self, form):
cat = Cat.objects.filter(id__exact=self.kwargs['pk'])
for each in form.cleaned_data['attachments']:
print('****', each, '****', type(each))
Photo.objects.create(photo_path=each, photo_author=self.request.user, photo_cat = cat[0])
return super(CatPhotoUploadFormView, self).form_valid(form)
为此使用 Django 消息传递框架,将 get_success_url
更改为消息。
from django.contrib import messages
def get_success_url(self):
messages.add_message(self.request, messages.INFO, 'form submission success')
return reverse('cat:detail_cat', args=(self.kwargs['pk'],))
在您的模板中,类似这样的内容(注意:记得传递消息)
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
事实上,Django 有一个现成的 mixin,SuccessMessageMixin,可以在基于 class 的视图中使用,以达到相同的目的。
像这样:
from django.contrib.messages.views import SuccessMessageMixin
class CatPhotoUploadFormView(SuccessMessageMixin, FormView):
template_name = 'blank.html'
form_class = CatPhotoForm
success_message = 'Everything is fine'
...
非常干净直接。
def get_success_url(self):
from django.contrib import messages
messages.success(self.request, 'Yes it works!')
这将完成工作
def form_valid(self, form):
print(self.request.POST)
form.save()
messages.add_message(
self.request,
messages.SUCCESS,
'User registered sucessfully'
)
return super().form_valid(form)