Index ソフト・ハード Djangoタスク | formsサンプル |
project01 accounts thread |
project01 (モデルに対応するフォームを作成) accounts
from django.contrib.auth import authenticate, get_user_model
from django.forms import ModelForm, Form
from django.forms.fields import EmailField
from django import forms
# from django.contrib.auth.models import User
# from django.contrib.auth import get_user_model
from django.contrib.auth.forms import (
AuthenticationForm, PasswordChangeForm,
PasswordResetForm, SetPasswordForm,
UserChangeForm, UserCreationForm
)
from django.utils.translation import gettext_lazy as _
from django.utils.text import capfirst
from .models import User
UserModel = get_user_model()
class UserInfoChangeForm(ModelForm):
class Meta:
model = User
fields = [
'email',
# 'last_name',
# 'first_name',
]
def __init__(self, email=None, first_name=None, last_name=None, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
# ユーザーの更新前情報をフォームに挿入
if email:
self.fields['email'].widget.attrs['value'] = email
if first_name:
self.fields['first_name'].widget.attrs['value'] = first_name
if last_name:
self.fields['last_name'].widget.attrs['value'] = last_name
def update(self, user):
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
class EmailChangeForm(ModelForm):
class Meta:
model = User
fields = ['email']
def __init__(self, email=None, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
if email:
self.fields['email'].widget.attrs['value'] = email
def update(self, user):
user.email = self.cleaned_data['email']
user.save()
class CustomAuthenticationForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
class CustomPasswordChangeForm(PasswordChangeForm):
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
class CustomPasswordResetForm(PasswordResetForm):
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
class CustomSetPasswordForm(SetPasswordForm):
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = User
fields = '__all__'
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = User
fields = ('username', 'email')
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix','')
super().__init__(*args, **kwargs)
class EmailAuthenticationForm(Form):
# django.contrib.auth.form.AuthenticationFormをベース
email = EmailField(
label=_('Email'),
widget=forms.EmailInput(attrs={'autofocus': True,})
)
password = forms.CharField(
label=_("Password"),
strip=False,
widget=forms.PasswordInput,
)
error_messages = {
'invalid_login': _(
"Please enter a correct %(username)s and password. Note that both "
"fields may be case-sensitive."
),
'inactive': _("This account is inactive."),
}
def __init__(self, request=None, *args, **kwargs):
self.request = request
self.user_cache = None
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
# Set the max length and label for the "username" field.
self.email_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD)
self.fields['email'].max_length = self.email_field.max_length or 254
if self.fields['email'].label is None:
self.fields['email'].label = capfirst(self.email_field.verbose_name)
for field in self.fields.values():
field.widget.attrs["class"] = "form-control"
field.widget.attrs["placeholder"] = field.label
def clean(self): # clean関数内でauthenticate関数を呼び認証処理を行う。
email = self.cleaned_data.get('email')
password = self.cleaned_data.get('password')
if email is not None and password:
self.user_cache = authenticate(self.request, email=email, password=password)
if self.user_cache is None:
raise self.get_invalid_login_error()
else:
self.confirm_login_allowed(self.user_cache)
return self.cleaned_data
def confirm_login_allowed(self, user):
if not user.is_active:
raise forms.ValidationError(
self.error_messages['inactive'],
code='inactive',
)
def get_user(self):
return self.user_cache
def get_invalid_login_error(self):
return forms.ValidationError(
self.error_messages['invalid_login'],
code='invalid_login',
params={'username': _('Email')},
)
thread
from django import forms
from django.forms import ModelForm
from . models import Topic, Category, Comment
class TopicCreateForm(ModelForm): # Formを継承したModelFormクラス
class Meta:
model=Topic
fields=[
'title',
'user_name',
'category',
'message',
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['category'].empty_label = '選択して下さい' # 文言を変更
self.fields['user_name'].widget.attrs['value'] = '匿名' # 初期値
class TopicModelForm(forms.ModelForm): # ModelFormクラス
# ゲストユーザー用入力項目(user_nameとemailをクラス変数として追加)
# user_nameとemailについては管理画面では任意項目、
# ゲストユーザーの入力フォームのみで必須項目
user_name = forms.CharField(
label='ゲストユーザー名',
required=True,
)
email = forms.EmailField(
label='メールアドレス',
required=True,
)
class Meta:
model=Topic
fields=[
'title',
# 'user_name',
# 'email',
'category',
'message',
]
widgets = {
'title' : forms.TextInput(attrs={'class': 'hoge'}),
}
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
self.fields['category'].empty_label = '選択して下さい。'
self.fields['user_name'].widget.attrs['value'] = 'anonymous'
def save(self, commit=True):
topic = super().save(commit=False)
topic.user_name = self.cleaned_data['user_name']
topic.email = self.cleaned_data['email']
if commit:
topic.save()
return topic
class TopicForm(forms.Form): # Formクラス
label_suffix = ''
title = forms.CharField(
label='タイトル',
max_length=255,
required=True,
)
user_name = forms.CharField(
label='お名前',
max_length=50,
required=True,
widget=forms.TextInput(attrs={'value': '名無し'}),
)
category = forms.ModelChoiceField(
label='カテゴリー',
queryset=Category.objects.all(),
required=True,
empty_label='選択して下さい。',
)
message = forms.CharField(
label='本文',
widget=forms.Textarea,
required=True,
)
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
class CommentModelForm(forms.ModelForm):
# ゲストユーザー用入力項目
user_name = forms.CharField(
label='お名前',
required=True,
)
email = forms.EmailField(
label='メールアドレス',
required=True,
)
class Meta:
model = Comment
fields = [
'message',
'image',
]
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
self.fields['user_name'].widget.attrs['value'] = 'anonymous'
def save_with_topic(self, topic_id, commit=True, **kwargs):
comment = self.save(commit=False)
comment.topic = Topic.objects.get(id=topic_id)
comment.no = Comment.objects.filter(topic_id=topic_id).count() + 1
comment.user_name = self.cleaned_data['user_name']
comment.email = self.cleaned_data['email']
if commit:
comment.save()
return comment
class LoginedUserTopicModelForm(forms.ModelForm):
# ログインユーザ用のトピック作成フォーム)
class Meta:
model=Topic
fields=[
'title',
'category',
'message',
]
widgets = {
'title' : forms.TextInput(attrs={'class': 'hoge'}),
}
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
self.fields['category'].empty_label = '選択して下さい。'
def save(self, user, commit=True, **kwargs):
topic = super().save(commit=False)
topic.user = user
if commit:
topic.save()
return topic
class LoginedUserCommentModelForm(forms.ModelForm):
class Meta:
model = Comment
fields = [
'message',
'image',
]
def __init__(self, *args, **kwargs):
kwargs.setdefault('label_suffix', '')
super().__init__(*args, **kwargs)
def save_with_topic(self, topic_id, user, commit=True, **kwargs):
comment = self.save(commit=False)
comment.topic = Topic.objects.get(id=topic_id)
comment.no = Comment.objects.filter(topic_id=topic_id).count() + 1
comment.user = user
if commit:
comment.save()
return comment
|
All Rights Reserved. Copyright (C) ITCL |