User
モデルのプロファイルモデルとして使用しているPersonnel
というモデルがあります。ここに私のモデルカスタム外部キープロパティ
class Personnel(models.Model):
user = models.OneToOneField(
User
)
phone = models.CharField(
null=False, max_length=50, verbose_name="Phone"
)
です。ここに私のModelForm
です:
class PersonnelForm(forms.ModelForm):
class Meta:
model = Personnel
exclude = ('user')
def __init__(self, *args, **kwargs):
personnel = Personnel(user=User.objects.create(username=(''.join(choice(ascii_uppercase + digits) for x in range(30)))))
super(PersonnelForm, self).__init__(
instance=personnel, *args, **kwargs
)
私はので、私はそれを除外していますから、ウェブ上に表示されるuser
フィールドを必要といけません。しかし、私はまだPersonnelForm
のインスタンスをPersonnel
インスタンスに渡して開始するために値を渡す必要があります。 User
モードにはemail
というフィールドがありますが、これはユーザーが入力する必要がありますが、このフィールドは私のPersonnel
モデルのフィールドでは表示されません。
という仮想フィールドを作成して、user.email
フィールドの値を設定し、取得すると、同じ値を取得できますか?そのような何か:
@property
def email():
def fget(self):
return 'fff'
def fset(self, email):
self.user.email = email
I''lがDjango's generic CRUD viewsでPersonnelForm
を使用するので、私は上記のスニペットに似たいくつかの方法でそれを必要とします。
ありがとうございました。これは、作成に適しています
class PersonnelForm(forms.ModelForm):
email = forms.EmailField(
required=True, label=_("Email")
)
class Meta:
model = Personnel
exclude = ('user')
def save(self, *args, **kwargs):
commit = kwargs.get('commit', True)
kwargs['commit'] = False
personnel = super(PersonnelForm, self).save(*args, **kwargs)
if not personnel.user: #To prevent creating a new user when updating.
user = User.objects.create_user(
email=self.cleaned_data['email'],
username=(''.join(choice(ascii_uppercase + digits) for x in range(30))),
)
if commit:
personnel.save()
return personnel
:ダニエルのアドバイスを使用して
(それは同様他人の利益を得ることができるように、タイトルのためのより良い名前を編集して提案すること自由に感じて下さい。)
ModelFormを使用して新しいレコードを作成しましたが、更新するときに電子メールを更新したり、電子メールを表示したりすることはできません。
:あなたはこのロジックを実行するビューを変更したくないことを考えると
(IMOが間違っ決定であるが、それはあなたのコードだもの)、あなたは上書き
save
方法でこれを行うことができますPersonnelFormからプロパティを除外したため、ユーザーの値を渡す必要はありません。 – BrandonBrandon、私はユーザーフィールドを除外しないと、 'Personnel'レコードを作成する私のフォームのドロップダウンリストを私に与えます。私は 'Personnel'レコードを作成し、自動的に' User'を作成する必要があります。それぞれの 'User record'にはランダムな' username'があり、 'password'にはnullがあります。後でそれを扱いますが、メールアドレスを指定できるようにする必要があります。 –
私は完全に理解しています。 Userオブジェクトを作成し、プロパティの混乱を起こさずにプロパティを設定することができます。 Userオブジェクトを作成できる場所は、Personnelオブジェクトのsaveメソッド、Personnelフォームを処理するビュー、またはPersonnelクラスに添付されたpost_save信号でも少なくとも3つあります。 – Brandon