как отправить сообщение об успехе, если мы используем общие представления django
Я новичок в django (1.2.4). Я создал некоторые crud с общими представлениями. Но как я могу показать что-то вроде "студент был добавлен успешно", когда студент создается с помощью платформы обмена сообщениями django?
4 ответов
насколько я знаю, нет простого способа сделать это, используя традиционные общие представления. Я всегда чувствовал, что документация по общим представлениям довольно отсутствует и поэтому никогда не использовала их.
теоретически вы можете использовать декоратора, предположив, что перенаправление означает успешную подачу.
таким образом, вы можете написать что-то вроде этого (ни один из этого кода не был проверено):
urls.py:
try:
from functools import wraps
except ImportError:
from django.utils.functional import wraps
from django.http import HttpRedirectResponse
from django.contrib import messages
from django.views.generic import *
def add_message(success_message=None):
def decorator(func):
def inner(request, *args, **kwargs):
resp = func(request, *args, **kwargs)
if isinstance(resp, HttpRedirectResponse):
messages.success(request, message)
return resp
return wraps(func)(inner)
return decorator
student_info_edit = {
'template_name': 'myapp/student/form.html',
'template_object_name': 'student',
'form_class': studentForm,
}
student_info_new = {
'template_name': 'myapp/student/form.html',
'form_class': studentForm,
'post_save_redirect': '/myapp/students/',
}
urlpatterns += patterns('',
url(r'^students/$', list_detail.object_list, { 'queryset': Student.objects.all() }, name="students"),
url(r'^students/(?P<object_id>\d+)/$', add_message("Student record updated successfully")(create_update.update_object), student_info_edit, name="student_detail"),
url(r'^students/new$', add_message("The student was added successfully.")(create_update.create_object), student_info_new, name="student_new"),
)
все, что сказано и закодировано, Django 1.3 представил класса универсальный вид, поэтому, если вы заинтересованы в переходе на Django 1.3, вы должны изучить их. Они могут позволить больше настройки, не уверен.
в долгосрочной перспективе я редко вижу форму выгоды, используя общие представления, и это удваивается для таких вещей, как add/update.
по состоянию на в Django 1.6+, используя общие представления на основе классов, вы можете положиться на successMessageMixin. Это так же просто, как добавить mixin в определение класса и настройки success_message
атрибут для того, что вы хотите.
как упоминал Оливье Вердье, пожалуйста, не забудьте отображать сообщения в вашем основном шаблоне!
простой пример из docs:
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreate(SuccessMessageMixin, CreateView):
model = Author
success_url = '/success/'
success_message = "%(name)s was created successfully"
более сложный пример:
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from myapp.models import ComplicatedModel
class ComplicatedCreate(SuccessMessageMixin, CreateView):
model = ComplicatedModel
success_url = '/success/'
success_message = "%(calculated_field)s was created successfully"
def get_success_message(self, cleaned_data):
# cleaned_data is the cleaned data from the form which is used for string formatting
return self.success_message % dict(cleaned_data,
calculated_field=self.object.calculated_field)
функциональность, которую вы просите, уже реализована в общих представлениях Django:
https://github.com/django/django/blob/1.2.X/django/views/generic/create_update.py#L115
вы увидите сообщения показывать сообщения в основной шаблон.
на самом деле я думаю, что документы объясняют это довольно хорошо для общих / функциональных представлений: https://docs.djangoproject.com/en/2.0/ref/contrib/messages/
он в основном передает контекст вашему шаблону с оператором if для отображения этого контекста или нет.
вид:
from django.contrib import messages
def home_page(request):
if request.method == 'POST':
messages.success(request, 'Student added successfully')
context = {}
return render(request, 'homepage/index.html', context)
else:
form =yourForm()
return render(request, 'homepage/index.html', form)
и затем он будет отображаться в вашем шаблоне, используя следующее. Не забудьте повторить"...потому что в противном случае хранилище сообщений не будет очищено для следующая просьба':
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
поскольку он снова отображает страницу, просто добавьте тег привязки в свою форму и включите в свою форму действие, т. е.
action="{% url 'home_page:index' %}#subscribe"
если вы используете bootstrap, добавьте класс alert-success