2

次のようなモデルがあるとしましょう。

models.py

class Profile(models.Model):
    user = models.OneToOneField(User)
    middle_name = models.CharField(max_length=30, blank=True, null=True)

emailそして、ModelFormに次のようなカスタムフィールドがあります

forms.py

class ProfileForm(ModelForm):
    email = forms.CharField()
    class Meta:
         model = models.Profile

    fields = ('email', 'middle_name')

上記のモデルフォームのインスタンスを設定しているので、次のように編集テンプレートのフォームにデータが事前に入力されます。

views.py

def edit_profile(request):
    profile = models.Profile.objects.get(user=request.user)
    profileform = forms.ProfileForm(instance=profile)
    return render_to_response('edit.html', { 'form' : 'profileform' }, context_instance=RequestContext(request))

これで、フォームでプロファイルモデルのすべてのフィールドにすべての値が事前に入力されましたが、カスタムフィールドは空であり、意味があります。

しかし、カスタムフィールドの値を事前に入力する方法はありますか?多分次のようなものです:

email = forms.CharField(value = models.Profile.user.email)
4

1 に答える 1

6

他に何か提案してもいいですか?私はemail、ModelForm内にそのフィールドがありProfile、そのモデルとは何の関係もないかどうかという大ファンではありません。

代わりに、2つのフォームを用意して、初期データを含むカスタムデータに渡すのはemailどうでしょうか。したがって、次のようになります。

forms.py

# this name may not fit your needs if you have more fields, but you get the idea
class UserEmailForm(forms.Form):
    email = forms.CharField()

views.py

profile = models.Profile.objects.get(user=request.user)
profileform = forms.ProfileForm(instance=profile)
user_emailform = forms.UserEmailForm(initial={'email': profile.user.email})

次に、プロファイルとユーザーの電子メールフォームの両方を検証しますが、それ以外はほとんど同じです。

プロファイルModelFormとこのUserEmailFormの間でロジックを共有していないと思います。プロファイルインスタンスデータが必要な場合は、いつでもそこに渡すことができます。

このアプローチの方が魔法が少ないので、私はこのアプローチを好みます。1年後にコードを振り返ると、簡単なスキャンで、なぜそのモデルのフィールドとして存在しないのになぜemailその一部であるのか不思議に思うことはありません。ModelForm

于 2012-12-20T12:33:38.637 に答える