Как я могу реализовать всю бизнес-логику от представлений до форм? - PullRequest
1 голос
/ 11 марта 2019

Я работаю над веб-приложением и хочу переместить свою логику в представлениях в формы. В представлениях я только хочу сохранить проверку валидации. То есть:

Пример

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)

Пока все работает нормально. Я просто хочу переместить логику в представлениях в формы. Вот и все.

EDIT: Я изменил свои формы.

Вот мой новый 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'

Traceback:

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'

1 Ответ

0 голосов
/ 11 марта 2019

Для этого вы можете переопределить метод 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'),
]

Кроме того, вы должны установить URL перенаправления входа и выхода вsettings.py, так как вы используете по умолчанию login() метод

LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = '/' //change as you wish
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...