【问题标题】:Show a successful message with Class Based Views使用基于类的视图显示成功消息
【发布时间】:2014-09-14 21:10:57
【问题描述】:

我想在保存一行时显示一条成功的消息,使用 Django 的消息传递框架和基于类的视图,代码如下所示,但不显示消息。

任何帮助将不胜感激

#views.py

from django.views.generic import ListView, CreateView, UpdateView, TemplateView
from django.contrib.messages.views import SuccessMessageMixin

class CreateEmployee(SuccessMessageMixin, CreateView):
    model = Employee
    template_name = 'employees/create.html'
    form_class = frmCreate

    def get_success_url(self):
       return reverse('Employees:Create')

    def get_context_data(self, **kwargs):
        contexto = super(CreateEmployee, self).get_context_data(**kwargs)
        contexto['action'] = reverse('Employees:Create')
        return contexto

    success_message = 'Employee successful created'



#template
#create.html

<form action="{{ action }}" method="POST" role="form">
    {% csrf_token %}

    {{ form.as_p }}

    <input type="submit" value="Save" class="btn btn-success">
<form>

{% if messages %}
    <div class="col-lg-3 color03">
        <ul class="messages">
            {% for message in messages %}
                <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
            {% endfor %}
        </ul>
    </div>
{% endif %}

【问题讨论】:

  • 您是否尝试将参数的顺序从类 CreateEmployee(CreateView, SuccessMessageMixin) 更改为类 CreateEmployee(SuccessMessageMixin, CreateView),例如 django 文档中的示例:docs.djangoproject.com/en/dev/ref/contrib/messages/…
  • @szymanskilukasz 我已经完成了建议的更改,这解决了我的问题,f..ck 我,太盲目了
  • @ElioClímacoHerrera 我猜你的表单抛出错误而不是保存。你检查过吗?此外,Mixin 应该按照文档中所述的顺序进行。
  • 是的@sagarchalise 我的表单正在保存数据,感谢您的帮助。我,解决了改变参数的顺序
  • 这可能是this的副本!

标签: django django-messages


【解决方案1】:

只需像这样使用self.request

from django.contrib import messages
messages.add_message(self.request, messages.INFO, 'Hello world.')

【讨论】:

  • 我无法使用已接受的答案,我使用的是 Django 1.11,而这个刚刚工作。 def form_valid(self, form)
【解决方案2】:

使用 Django 2.2,根据文档 here,以下是我在基于 CLASS 的视图上的工作:

settings.py

INSTALLED_APPS = [
    'django.contrib.messages',
]

MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]

TEMPLATES = [
    {
        'BACKEND': #,
        'DIRS': #,
        'APP_DIRS': #,
        'OPTIONS': {
            'context_processors': [
                'django.contrib.messages.context_processors.messages',
          ],
     },
]

“默认存储后端依赖于会话。这就是为什么 SessionMiddleware 必须启用并出现在 MIDDLEWARE 中的 MessageMiddleware 之前的原因。

views.py

from django.contrib.messages.views import SuccessMessageMixin

class SignUpView(SuccessMessageMixin, CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('users:login')
    template_name = 'users/register.html'
    success_message = "%(username)s was created successfully"

urls.py

path(_('register/'), views.SignUpView.as_view(), name='register'),

在模板中: (使用引导类)

 {% if messages %}
     {% for message in messages %}
         <div class="text-center alert alert-{{ message.tags }}">
             {{ message|safe }}
         </div>
     {% endfor %}
 {% endif %}

【讨论】:

    【解决方案3】:
    #Using django 3.2
    
    #In views.py  
    
    from django.contrib import messages
    from .models import CreateEmployer
    from django.views.generic import CreateView
    
    class SignUpView(CreateView):
        model = CreateEmployer
        template_name = ‘employee/register_employee.html’
        fields = '__all__'
    
        # this method will enable your message to display
        # you can also use it to overwrite form data.
        def form_valid(self, form):
            messages.success(self.request, f”Account created successfully”)
            return super().form_valid(form)
    
    
    #in your urls.py
    from .views import SingUpView
    from django.urls import path
    
    
    urlpatterns = [
        path(‘register/‘, SignUpView.as_view(), name=“user-register"),
    ]
    
    
    #in your template
    
     {% if messages %}
       {% for message in messages %}
         <div class="alert alert-{{message.tags}}">
           {{message}}
         </div>
       {% endfor %}
    {% endif %}
    
    
    #I hope this helps anyone facing same problem in the future.
    

    【讨论】:

      【解决方案4】:

      你必须在settings.py中设置消息存储

      MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'
      

      问候

      【讨论】:

      • 默认情况下和今天一样,一旦你创建了一个项目,所有的消息包都会被加载到项目设置中,所以你不一定需要在设置中设置消息存储,但它可以使用也谢谢。
      【解决方案5】:

      Django==3.2.8

      views.py

      您需要在 views.py 文件中的 CreateEmployee 类添加以下内容:-

      def form_valid(self):
              messages.success(self.request, f"Account created successfully")
              return HttpResponseRedirect(self.get_success_url()
      

      base.html 在顶部 base.html 你需要添加这个:-

      <div class="container">
          {% if messages %}
                  {% for message in messages %}
                    <div class="alert alert-{{ message.tags }}">
                      {{ message|safe }}
                    </div>
                  {% endfor %}
                {% endif %}
          {% block content %}{% endblock content %}
        </div>
      

      base.html 类中使用 bootstrap 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-11
        • 1970-01-01
        • 2016-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多