Как отправить сообщение об успехе, если мы используем общие представления Django - PullRequest
12 голосов
/ 26 января 2011

Я новичок в Джанго (1.2.4). Я создал некоторые грубые с общими взглядами. Но как я могу показать что-то вроде «Ученик был успешно добавлен», когда ученик создан с использованием среды обмена сообщениями django?

Ответы [ 4 ]

37 голосов
/ 06 февраля 2014

Начиная с Django 1.6 + , используя любые обобщенные представления на основе классов , вы можете положиться на successMessageMixin . Это так же просто, как добавить миксин к определению вашего класса и установить атрибут success_message на то, что вы хотите.

Как уже упоминал Оливье Вердиер, не забывайте отображать сообщения в вашем основном шаблоне!

простой пример из документов :

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)
4 голосов
/ 26 января 2011

Насколько я знаю, не существует простого способа сделать это, используя традиционные общие представления. Я всегда чувствовал, что документации по общим представлениям довольно не хватает, и поэтому никогда не использовал их.

Теоретически вы можете использовать декоратор, предполагая, что перенаправление означает успешную отправку.

Таким образом, вы могли бы написать что-то вроде этого (ни один из этого кода не был проверен):

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, вам следует изучить их. Они могут позволить больше настроек, не уверен.

В долгосрочной перспективе я редко вижу форму преимущества, использующую общие представления, и это удваивается для таких вещей, как добавление / обновление.

2 голосов
/ 03 апреля 2011

Запрашиваемая вами функция уже реализована в общих представлениях Django:

https://github.com/django/django/blob/1.2.X/django/views/generic/create_update.py#L115

Вы увидите сообщения с отображением сообщений в вашем основном шаблоне.

0 голосов
/ 30 мая 2018

На самом деле, я думаю, что документы достаточно хорошо объясняют это для общих / функциональных представлений: 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"

Если вы используете загрузчик, добавьте класс alert-success

...