私はカスタムユーザーモデルにOneToOneFieldでプロファイルモデルを紐付けて、会員登録後に編集出来るユーザー情報ページにカスタムユーザーモデルで作ってフィールドとプロファイルモデルで作ったフィールドを表示させ、情報を保存出来る様にしたいです。
現在はプロファイルモデルの紐付けは完了しており、2つのフィールドをユーザー情報ページに表示させる所で躓いております。
ユーザー情報ページは会員登録した人のみが編集出来るページとなっております。
また、カスタムユーザーモデルに独自のフィールドを追加する事はダメなのでしょうか?
例えば
class User(AbstractBaseUser, PermissionsMixin):
file = ImageFiled()
python
1'''models.py''' 2 3class Profile(models.Model): 4 name = models.CharField(("ハンドルネーム"), max_length=255) 5 phone = models.CharField("電話番号", max_length=255, blank=True) 6 gender = models.CharField("性別", max_length=2, choices=GENDER_CHOICES, blank=True) 7 user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 8 9 10 def __str__(self): 11 return self.name 12 13 14class UserManager(BaseUserManager): 15 """ユーザーマネージャー(省略).""" 16 17 18class User(AbstractBaseUser, PermissionsMixin): 19 """カスタムユーザーモデル.""" 20 21 email = models.EmailField(_('email address'), unique=True) 22 first_name = models.CharField(_('first name'), max_length=30, blank=True) 23 last_name = models.CharField(_('last name'), max_length=150, blank=True) 24 '''以下省略'''
python
1'''views.py''' 2class UserUpdate(OnlyYouMixin, generic.UpdateView): 3 model = User 4 form_class = UserUpdateForm 5 template_name = 'register/user_form.html' 6 7 def get_success_url(self): 8 return resolve_url('register:user_detail', pk=self.kwargs['pk']) 9
python
1'''forms.py''' 2 3class ProfileForm(forms.ModelForm): 4 class Meta: 5 model = Profile 6 fields = ( 7 "name", "gender", "phone" 8 ) 9 10class UserUpdateForm(forms.ModelForm): 11 """ユーザー情報更新フォーム""" 12 13 class Meta: 14 model = User 15 fields = ('last_name', 'first_name',) 16 17 def __init__(self, *args, **kwargs): 18 super().__init__(*args, **kwargs) 19 for field in self.fields.values(): 20 field.widget.attrs['class'] = 'form-control'
html
1<---ユーザー情報更新ページ---!> 2<---user_form.html---!> 3 4<form action="" method="POST"> 5 {{ form.non_field_errors }} 6 <table class="table"> 7 <tbody> 8 {% for field in form %} 9 <tr> 10 <th><label for="{{ field.id_for_label }}">{{ field.label }}</label></th> 11 <td>{{ field }} {{ field.errors }}</td> 12 </tr> 13 {% endfor %} 14 </tbody> 15 </table> 16 {% csrf_token %} 17 <button type="submit" class="btn btn-success btn-lg" >送信</button> 18</form>
調べた事・試した事
2つのフィールドを汎用クラスビューで一度に表示出来る方法を色々試してみました。
ユーザー情報更新ページに2つのフィールドを表示させる事に成功したのですが、入力した情報を送信してもモデルに情報が保存されるませんでした。そのコードが下記になります。
python
1'''views.py''' 2 3class UserUpdate(OnlyYouMixin, generic.UpdateView): 4 model = User 5 fields = () 6 template_name = 'register/user_form.html' 7 8 def get_success_url(self): 9 return resolve_url('register:user_detail', pk=self.kwargs['pk']) 10 11 def get_context_data(self, **kwargs): 12 # スーパークラスのget_context_dataを使うとobject_listに 13 # 表示中のモデルの情報が入るのでそれを利用 14 context = super().get_context_data(**kwargs) 15 # contextは辞書型 16 context.update({ 17 'qustion_text_form': ProfileForm(**self.get_form_kwargs()), 18 'choice_text_form': UserUpdateForm(**self.get_form_kwargs()), 19 }) 20 return context
html
1<---ユーザー情報更新ページ---!> 2<---user_form.html---!> 3 4{{ choice_text_form.as_p }} 5{{ qustion_text_form.as_p }} 6<---上記コードをformタグの中に挿入しました。---!>
こちらで以上となります。ご回答の程何卒よろしくお願い申し上げます。
あなたの回答
tips
プレビュー