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