2016-11-05 8 views
-1

Django 1.10。*を使用しています。これは私のユーザー・プロファイル・モデルである:Djangoモデルの拡張デフォルトのユーザーモデル(一対一フィールド)、すべての結合モデルフィールドのregフォームの作成方法

:私は学生のためにフォームクラスを作成し、このようにHTMLテンプレートにformコンテキストを渡す私のビューでFormViewコントロールクラスを拡張するViewクラスを作成するためにそれを使用

class student(models.Model): 
    user = models.OneToOneField(User, primary_key=True, on_delete=models.CASCADE) 
    state = models.CharField(max_length=21, null=True, blank=True, choices=in_states.STATE_CHOICES) 
    city = models.CharField(max_length=21, null=True, blank=True) 
    date_joined = models.DateTimeField(default=timezone.now) 
    educational_role = models.CharField(max_length=39, choices=EDUCATIONAL_ROLE) 
    institute = models.ForeignKey(educational_institute, null=True, blank=True) 
    language = models.CharField(max_length=8, choices=LANGUAGES) 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     student.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

forms.py:

class RegistrationForm(forms.ModelForm): 
    class Meta: 
     model = student 
     fields = ['user', 'state', 'city', 'educational_role', 'institute', 'language'] 

views.py:

class Register(FormView): 
    template_name = 'searcher/register.html' 
    form_class = RegistrationForm 

    def get_context_data(self, **kwargs): 
     context = super(Register, self).get_context_data(**kwargs) 
     context['applink'] = applink 
     context['forumlink'] = forumlink 
     return context 

が存在しない場合は、どのように私はUserモデルのemailfirstname、登録フォームがusernameを要求するように、これを変更する必要があるともstudentモデルによって追加されたフィールドや新educational_instituteを作成するためのオプションを持ちますか既に?

答えて

0

multi-table inheritancedjango.contrib.auth.models.Userを使用できます。 DjangoはModelFormUpdateViewなどの機能はすべて、追加いじることなく機能する必要があり

from django.contrib.auth.models import User 

class Student(User): 
    state = models.CharField(...) 
    ... 

この方法:次のようになります。背後では、Djangoはまったく同じようにOneToOneFieldを作成します。

あなたのすべてのユーザーが学生の場合は、replace the auth user model entirelyでもかまいません。

あなたがそれらのいずれかを実行したくない場合は、あなたが(例では__init__に)そのデフォルト値を設定するの世話を、あなたはMetaを形成する場合は、それらを指定し、フォームにフィールドを追加する必要があります、cleaningこれらモデルをOneToOneFieldの背後に保存してください。

+0

はい、私はあなたの主張を得ていますが、Authの目的のために、 'User'ではなく' AbstractUser'クラスを直接拡張する方がはるかに優れていることがわかりました: 'class Student(AbstractUser):'。あなたは何を言っていますか? –

+0

これらの2つのオプションのわずかな違いは、 '' AbstractUser'''から継承すると、あなたのユーザモデルはもうスワップできなくなるということです:https://github.com/django/django/blob/master/django/ contrib/auth/models.py#L367傷つけることはありませんが、おそらくそれを交換することは決してありません。しかし、将来、Djangoの人が何かを変更した場合でも、私は '' User'''から正確に継承したいと思うでしょう。 – Art

+0

'User'クラスから拡張した場合、userchangeform、usercreationform、登録ビュー(MyUserのすべての追加フィールドも含む)の作成方法に関する完全なガイドを与えることができます。 「ページ」? –

関連する問題