0

私のプロジェクトでは、教師と生徒の 2 種類のユーザーがいて、それぞれに独自のプロファイル データがあります。

最善のアプローチを探した後、先に進む方法はマルチテーブル継承を使用することです。

class BaseProfile(models.Model):
    user = models.OneToOneField(User)
    profile = models.CharField (max_length=10, choices={'teacher', 'student'})
    # other common fields

class Teacher(BaseProfile):
    # teacher specific fields

class Student(BaseProfile):
    # student specific fields

そしてsettings.py: AUTH_PROFILE_MODULE= myapp.BaseProfile.

ここで、django-profiles と同じ機能を実装したいと思います。

  • プロファイルを作成する
  • プロフィールを編集する
  • プロフィールを表示する

field profileofに正しい値がある場合、編集と表示の部分を行う方法がよくわかりますBaseProfile

問題:

ここで、シグナルを使用してユーザーが作成されたときに、プロファイルの作成を自動的に (そして適切な db:TeacherまたはでStudent) 直接行いたいと考えています。profileユーザーが登録フォームを介してサイトから登録する場合、フィールドには値「学生」が含まれている必要があります。管理者が管理インターフェイスを介して新しいユーザーを作成する場合、値は「教師」である必要があります。

どうすればこれを達成できるか考えている人はいますか? おそらく、以下のようなカスタム シグナルを作成し、ユーザー モデルから送信する必要がありますが、まだ有効な解決策が見つかりませんでした。

def create_user_profile(sender, instance, request, **kwargs):
    if request.user.is_staff:
        BaseProfile(user=instance, profile='teacher').save()
    else:
        BaseProfile(user=instance, profile='student').save()

もちろん、他のより良いアプローチも大歓迎です!

ありがとう!

4

1 に答える 1

1

私の意見では、それは良いアプローチではありません。

オプションを含む 1 つの統合プロファイルを作成することをお勧めします: user_type = models.CharField(choices=[your_choices], max_length=4)

次に、モデルで 2 つのフォームを作成します。1 つは教師用、もう 1 つは生徒用です。

class ProfileFOrm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(BaseProfileForm, self).__init__(*args, **kwargs)
        for name in self.fields:
            self.fields[name].required = True

class TeacherProfile(ProfileForm):
    class Meta:
        model = Profile
        fields = ('your_fields')


class StudentProfile(ProfileForm):
    class Meta:
        model = Profile
        fields = ('school')

それは私の考えです:)


編集済み

プロファイル版:

見る。

def profile(request):
p = get_objects_or_404(ProfileModel, user=request.user)
return TemplateResponse(request, 'template.html', {'profile': p})

モデルでは、ユーザーが学生か教師かを確認する関数が必要なので、次のようにします。

class Profile(models.Model):
    ... your fields here...
    def get_student(self):
        return self.user_type == 1

テンプレート内:

{% if profile.get_student%}

>>>>get all data for students ex: <<<<
{{profile.name}}

{% endif %}


{% if profile.get_teacher %}
....
于 2012-07-05T06:09:00.970 に答える