, так что я новичок здесь в 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())