vim*_*vim 13 python django django-generic-views
我正在尝试使用基于Djangos类的通用视图编写CRUD应用程序.以下是我编写的用于在db中创建新用户的代码.
from django.views.generic import CreateView
from django.contrib.auth.decorators import login_required
from django.contrib import messages
class UserCreateView(CreateView):
"""
Display and accept a new user to be created in db
"""
form_class = ProfileForm
template_name = 'userdb/profile_form.html'
success_url = '/organization/users/'
def post(self, request, *args, **kwargs):
messages.success(request, "Success", extra_tags='msg')
return super(UserCreateView, self).post(request, *args, **kwargs)
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(UserCreateView, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
请注意,要添加要显示给用户的成功消息,我必须扩展post函数.我知道这不是一个好方法,因为当调用此函数时,不确定提交的表单是否包含有效数据.所以我的问题是,是否有推荐的方法将Djangos消息传递框架与基于类的通用视图相结合?
Yuj*_*ita 16
答案取决于您对消息传递框架的具体要求.如果需要为每个get
请求调用它,你自然需要将它放在get
方法中(指出没有人放置这个代码的正确位置).
无论如何,听起来你正在寻找一个只在表格有效时触发的地方.
CreateView
使用the ModelFormMixin
实现一个form_valid
方法,该方法仅在成功保存表单时触发.完善!
def form_valid(self, form):
messages.success(self.request, "Success", extra_tags='msg')
return super(UserCreateView, self).form_valid(form)
# ModelFormMixin will now save
# FormMixin will now redirect to success_url()
# override above behavior if you need to do something with the object
Run Code Online (Sandbox Code Playgroud)