python - 如何实现从视图到表单的所有业务逻辑?
问题描述
我正在开发一个 web 应用程序,我想将视图中的逻辑移动到表单中。在视图中,我只想继续检查验证。那是:
示例:
def myformview(request):
if request.POST:
form = MForm(request.POST)
if form.is_valid():
form.save()
redirect("to-some-view")
render(request, "template_name.html", {
'form': form
})
这是我的views.py:
def login_user(request):
if request.method == 'POST':
login_form = Login(request.POST)
if login_form.is_valid():
email = login_form.cleaned_data['email']
password = login_form.cleaned_data.get('password')
user = authenticate(email=email, password=password)
if user in User.objects.all():
login(request, user)
return HttpResponseRedirect(reverse('dashboard'))
else:
return render(request, 'todoapp/waiting_2.html')
return render(request, 'registration/login.html', {'form': Login()})
这是我的forms.py:
class Login(forms.Form):
email = forms.EmailField(max_length=250)
password = forms.CharField(widget=forms.PasswordInput)
目前一切正常。我只想将视图中的逻辑移动到表单中。而已。
编辑:
我更改了 forms.py 和 views.py,但它仍然无法正常工作,并且出现Page Not Found 404
错误。
这是我的新forms.py:
class Login(forms.Form):
email = forms.EmailField(max_length=250)
password = forms.CharField(widget=forms.PasswordInput)
def login_user(self):
email = self.cleaned_data['email']
password = self.cleaned_data.get('password')
user = authenticate(email=email, password=password)
if user in User.objects.all():
login(self, user)
else:
return render(self, 'todoapp/waiting_2.html')
这是我的新views.py: :
def login_user(request):
if request.method == 'POST':
login_form = Login(request.POST)
if login_form.is_valid():
return HttpResponseRedirect(reverse('dashboard'))
else:
return render(request, 'todoapp/waiting_2.html')
return render(request, 'registration/login.html', {'form': Login()})
这是我的urls.py:
from django.conf.urls import url
from .import views
urlpatterns = [
url(r'^index/', views.index, name='index'),
url(r'^register/', views.register, name='register'),
url(r'^login/', views.login_user, name='login_user'),
url(r'^dashboard/', views.dashboard, name='dashboard'),
url(r'^logout_user/', views.logout_user, name='logout_user'),
url(r'^auth_users/', views.auth_users, name='auth_users'),
# url(r'^authorize_final', views.authorize_final, name='authorize_final'),
url(r'^assigntask', views.assigntask, name='assigntask'),
# url(r'^assign', views.assign, name='assign'),
url(r'^task_list', views.view_task_list, name='view_task_list'),
# url(r'^delete_task', views.delete_task, name='delete_task'),
]
我得到的错误是:
AttributeError at /login/
'Login' object has no attribute 'session'
追溯:
File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/gblp250/PycharmProjects/assignment/todoapp/views.py" in login_user
48. login_form.login_user(request)
File "/home/gblp250/PycharmProjects/assignment/todoapp/forms.py" in login_user
27. login(self, request, user)
File "/home/gblp250/PycharmProjects/practice/venv/local/lib/python2.7/site-packages/django/contrib/auth/__init__.py" in login
126. if SESSION_KEY in request.session:
Exception Type: AttributeError at /login/
Exception Value: 'Login' object has no attribute 'session'
解决方案
为此,您可以覆盖表单中的is_valid
方法(请参阅此链接)并将您的逻辑放在那里,但是,更合适的方法是在视图中使用基于类的FormView
视图并对其进行操作。
请参阅此链接作为了解 FormView 泛型基于类的方法的开始。一旦您了解如何使用它,这将大大简化该过程。
编辑 :
总体上看起来不错,但仍然有错误的逻辑实现
class Login(forms.Form):
email = forms.EmailField(max_length=250)
password = forms.CharField(widget=forms.PasswordInput)
def login_user(self, request):
email = self.cleaned_data['email']
password = self.cleaned_data.get('password')
user = authenticate(request, email=email, password=password)
if user:
login(request, user) // self should have been replaced by request
else:
return HttpResponseRedirect(reverse('view_task_list'))//You can redirect to any url
这是我的新views.py::
def login_user(request):
if request.method == 'POST':
login_form = Login(request.POST)
if login_form.is_valid():
login_form.login_user(request) //just call the method created in the form
else:
login_form = Login() //this is for GET REQUEST
return render(request, 'registration/login.html', {'form': login_form}) //you should return instance of the form
这是我的 urls.py:
from django.conf.urls import url
from .import views
urlpatterns = [
url(r'^index/', views.index, name='index'),
url(r'^register/', views.register, name='register'),
url(r'^login/', views.login_user, name='login_user'),
url(r'^dashboard/', views.dashboard, name='dashboard'),
url(r'^logout_user/', views.logout_user, name='logout_user'),
url(r'^auth_users/', views.auth_users, name='auth_users'),
# url(r'^authorize_final', views.authorize_final, name='authorize_final'),
url(r'^assigntask', views.assigntask, name='assigntask'),
# url(r'^assign', views.assign, name='assign'),
url(r'^task_list', views.view_task_list, name='view_task_list'),
# url(r'^delete_task', views.delete_task, name='delete_task'),
]
另外,settings.py
由于您使用的是 g 默认login()
方法,因此您必须在其中设置登录和注销重定向 URL
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/' //change as you wish
推荐阅读
- java - 需要帮助设置我的 (java) Odata 服务以通过 SDK 将二进制文件发送到我的 SAP 系统(更新)
- ruby-on-rails - Rails - 转储请求标头给出无法转储匿名模块
- python - Python正则表达式从字符串中获取所有图像src'
- rest - 如何使用jmeter发送多个json正文?
- python - 如何每 10 秒将数据写入文件
- php - 亚马逊通过使用 API PHP/jQuery 搜索 ASIN 获取商品详情
- javascript - 在 React Native 中的 FlatList 中延迟加载项目?
- java - Java中的版本比较
- regex - 基于缩进文本匹配的正则表达式前瞻
- git - Github - 合并被阻止 - 基础分支要求对所有提交进行签名