можно ли использовать formview вместо updateview, createview в Django? - PullRequest
0 голосов
/ 06 апреля 2020

, так что я новичок здесь в django и уже получил некоторую оценку generic views, но мне действительно трудно понять UpdateView, CreateView и DeleteView всю информацию, которую я поиск до сих пор не дает мне понять, как их использовать. Итак, у меня есть форма регистрации, в которой есть имя пользователя и пароль, но они сохраняются в различных table или model; Вы можете взглянуть на forms.py, и попытка UpdateView дает мне только ошибку в моем проекте. Поэтому, как я обнаружил на некоторых форумах, я не могу использовать UpdateView для foreign key таблицы, поскольку она выглядит только как primary key Так что вместо того, чтобы использовать их, я использую FormView вместо 3 generic view. Можно ли использовать FormView в качестве опции, кроме 3 generic view?

Вот мой исходный код.

forms.py:

from django import forms

class UserCredentialForm(forms.Form):
    username = forms.CharField(label = 'Email', widget = forms.TextInput(
        attrs = {
            'id': 'id_login_username',
            'class': 'form-control',
            'autocomplete': 'off',
        }
    ), required = False)
    password = forms.CharField(label = 'Password', widget = forms.PasswordInput(
        attrs = {
            'id': 'id_login_password',
            'class': 'form-control',
        }
    ), required = False)

class UserInfoForm(forms.Form):
    year  = {}
    days  = {}
    month = {
        '': '---------',
        'Jan': 'January', 'Feb': 'February', 'Mar': 'March',
        'Apr': 'April', 'May': 'May', 'Jun': 'June', 'Jul': 'July',
        'Aug': 'August', 'Sep': 'September', 'Oct': 'October',
        'Nov': 'November', 'Dec': 'December'
    }
    gender = {
        'Male': 'Male', 'Female': 'Female',
        'Not Specify': 'Not Specify'
    }

    year[''] = '---------'
    days[''] = '---------'

    from datetime import datetime

    for i in range((int(datetime.now().strftime('%Y'))), (1920 - 1), -1):
        year[i] = i

    for i in range(1, (31 + 1)):
        days[i] = i

    password = forms.CharField(label = 'Password', widget = forms.PasswordInput(
        attrs = {
            'id': 'id_signup_password',
            'class': 'form-control',
            'placeholder': 'Password'
        }
    ), required = True)
    email = forms.EmailField(label = 'Email', widget = forms.EmailInput(
        attrs = {
            'id': 'id_signup_email',
            'class': 'form-control',
            'placeholder': 'Email',
            'autocomplete': 'off'
        }
    ), required = True)
    firstname = forms.CharField(label = 'Firstname', widget = forms.TextInput(
        attrs = {
            'id': 'id_signup_firstname',
            'class': 'form-control',
            'placeholder': 'Firstname',
            'autocomplete': 'off'
        }
    ), required = True)
    lastname = forms.CharField(label = 'Lastname', widget = forms.TextInput(
        attrs = {
            'id': 'id_signup_lastname',
            'class': 'form-control',
            'placeholder': 'Lastname',
            'autocomplete': 'off'
        }
    ), required = True)
    gender = forms.ChoiceField(label = 'Gender', widget = forms.Select(
        attrs = {
            'id': 'id_signup_gender',
            'class': 'form-control',
        }
    ), choices = list(gender.items()), required = False)
    birthdate_year = forms.ChoiceField(label = 'Year', widget = forms.Select(
        attrs = {
            'id': 'id_signup_birthyear',
            'class': 'form-control',
        }
    ), choices = list(year.items()), required = True)
    birthdate_day = forms.ChoiceField(label = 'Day', widget = forms.Select(
        attrs = {
            'id': 'id_signup_day',
            'class': 'form-control',
        }
    ), choices = list(days.items()), required = True)
    birthdate_month = forms.ChoiceField(label = 'Month', widget = forms.Select(
        attrs = {
            'id': 'id_signup_month',
            'class': 'form-control',
        }
    ), choices = list(month.items()), required = True)

Это файл представления из login app:

views.py

from django.shortcuts import render, redirect
from django.urls import reverse_lazy
from .models import (
    UserModel,
)
from django.db.models import (
    Q,
)
from django.contrib.auth.hashers import (
    make_password, check_password
)
from django.views.generic.base import (
    TemplateView,
)
from django.views.generic import (
    FormView,
)
from .formprocess import (
    UserCredentialForm, UserInfoForm,
)
from .forms import (
    UserCredentialForm, UserInfoForm,
)

# Create your views here.

class LoginView(TemplateView):
    template_name = 'login/views/index.html'

    def get(self, request, *args, **kwargs):
        loginform    = UserCredentialForm(self.request.GET or None)
        registerform = UserInfoForm(self.request.GET or None)
        context = self.get_context_data(**kwargs)
        context['loginform']    = loginform
        context['registerform'] = registerform
        return self.render_to_response(context)

    def post(self, request, *args, **kwargs):
        mForm = UserCredentialForm(self.request.POST)
        if mForm.is_valid():
            mUsername  = mForm.cleaned_data['username']
            mPassword  = mForm.cleaned_data['password']
            mUserModel = UserModel.objects.filter(
                Q(email = mUsername) | Q(username = mUsername)
            )
            # Check if there is fetched data from UserModel.
            if not mUserModel:
                return redirect(reverse_lazy('login'))
            else:
                # Get password from query result.
                # Check if password valid or not.
                db_password = ''
                for obj in mUserModel:
                    db_password = obj.password
                if check_password(mPassword, db_password):
                    return redirect(reverse_lazy('site'))
                else:
                    return redirect(reverse_lazy('login'))
        else:
            return self.render_to_response(
                self.get_context_data(mForm)
            )

# Handle forms

def signup(request):
    return RegisterFormProcess(request).do_task()

def logout(request):
    return redirect('login')

и для метода процесса регистрации здесь:

from django.shortcuts import render, redirect, HttpResponseRedirect
from django.urls import reverse_lazy
from django.contrib import messages
from django.db.models import (
    Q,
)
from django.contrib.auth.hashers import (
    make_password, check_password,
)
from .models import (
    UserModel, UserInfoModel,
)
from .forms import (
    UserCredentialForm, UserInfoForm,
)

class RegisterFormProcess:
    def __init__(self, request):
        self.request = request

    def do_task(self):
        if self.request.method == 'POST':
            mRegisterForm = UserInfoForm(self.request.POST)
            if mRegisterForm.is_valid():
                # Collect data
                mFirstname = mRegisterForm.cleaned_data['firstname']
                mLastname  = mRegisterForm.cleaned_data['lastname']
                mEmail     = mRegisterForm.cleaned_data['email']
                mPassword  = mRegisterForm.cleaned_data['password']
                mGender    = mRegisterForm.cleaned_data['gender']
                mBYear     = mRegisterForm.cleaned_data['birthdate_year']
                mBDay      = mRegisterForm.cleaned_data['birthdate_day']
                mBMonth    = mRegisterForm.cleaned_data['birthdate_month']
                # Check if email is already exists.
                isEmaiExists = UserModel.objects.filter(email = mEmail)
                if not isEmaiExists:
                    # Validate password length.
                    if len(mPassword) < 4:
                        messages.error(self.request, 'Password is too short to use.')
                        return HttpResponseRedirect(reverse_lazy('login'))
                    else:
                        # Save user information and move to user profile settings.
                        from datetime import datetime
                        mUserModel = UserModel()
                        mUserModel.email     = mEmail
                        mUserModel.password  = make_password(mPassword)
                        mUserModel.status    = 'active'
                        mUserModel.date_join = datetime.now().strftime('%Y-%m-%d')
                        mUserModel.authority = 1
                        mUserModel.save()
                        mUserInfoModel = UserInfoModel()
                        mUserInfoModel.users     = mUserModel
                        mUserInfoModel.firstname = mFirstname
                        mUserInfoModel.lastname  = mLastname
                        mUserInfoModel.birthdate = f'{mBMonth} {mBDay}, {mBYear}'
                        mUserInfoModel.gender    = mGender
                        mUserInfoModel.save()
                        return HttpResponseRedirect(reverse_lazy('site'))
                else:
                    messages.error(self.request, 'Email is already in use.')
                    return HttpResponseRedirect(reverse_lazy('login'))
        else:
            mRegisterForm = UserInfoForm()
            return HttpResponseRedirect(reverse_lazy('login'))

и здесь файл представления site app:

views.py

from django.shortcuts import render, HttpResponse
from mediasocialplatform.wraps import login_required
from django.views.generic.base import (
    TemplateView,
)
from django.views.generic import (
    FormView,
)
from login.models import (
    UserInfoModel,
)
from login.forms import (
    UserInfoForm,
)

# Create your views here.

class SiteIndexView(TemplateView):
    template_name = 'site/views/index.html'

# THIS IS WHERE I WANT TO USE THE UPDATEVIEW
class SettingsProfileView(FormView):
    template_name       = 'site/views/settingsprofile.html'
    form_class          = UserInfoForm

    def get_context_data(self, **kwargs):
        mForm          = self.form_class(self.request.GET or None)
        kwargs['form']   = mForm
        kwargs['object'] = UserInfoModel.objects.filter(
            users_id = self.kwargs['pk']
        )
        return super().get_context_data(**kwargs)

    def get(self, request, *args, **kwargs):
        return self.render_to_response(self.get_context_data())

1 Ответ

0 голосов
/ 06 апреля 2020

UpdateView, CreateView и DeleteView существуют, чтобы сделать вашу жизнь проще. По сути, создавать простые формы и включать или исключать только те поля, которые вы видите или не хотите видеть, а об остальном позаботится Django. Это преимущество.

...