2

User Model (Django で事前定義) と、ForeignKey を介して接続された UserProfile モデルがあります。

ある種の登録フォームとして単一のテンプレートで使用する 2 つの別個の ModelForms を作成しています。

models.py

class UserProfile(models.Model):
    # This field is required.
    user = models.ForeignKey(User, unique=True, related_name="connector")
    location = models.CharField(max_length=20, blank=True, null=True)

フォーム.py

class UserForm(ModelForm):
    class Meta:
        model = User

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile

ただし、ページを読み込んでフォーム情報を入力すると、UserProfileForm では検証のためにユーザー フィールドを選択または入力する必要があります。

ただし、この「ユーザー」は現在作成中のユーザーであるため、まだ作成されていない/まだ作成されているため、「ユーザー」を選択できません。

このユーザーのフィールドの属性が unique=true であることは知っていますが、このフィールドを「オプション」にする方法はありますか?

私のビュー(以下)は、ユーザーオブジェクトが作成されると、UserProfileの外部キーをこの新しく作成されたユーザーオブジェクトに設定するように処理する必要があります(views.pyも何か間違っている場合を除きます)。

ビュー.py

@csrf_protect
def register(request):
    if request.method == 'POST':
        form1 = UserForm(request.POST)
        form2 = UserProfileForm(request.POST)
        if form1.is_valid() and form2.is_valid():
            #create initial entry for user
            username = form1.cleaned_data["username"]
            password = form1.cleaned_data["password"]
            new_user = User.objects.create_user(username, password)
            new_user.save()

            #create entry for UserProfile (extension of new_user object)      
            profile = form2.save(commit = False)
            profile.user = new_user
            profile.save()
            return HttpResponseRedirect("/books/")
    else:
        form1 = UserForm()
        form2 = UserProfileForm()
    c = {
        'form1':form1,
        'form2':form2,
    }
    c.update(csrf(request))
    return render_to_response("registration/register.html", c)
4

2 に答える 2

2

さて、あなたは設定することができます:

user = models.ForeignKey(User, unique=True, blank=True, null=True, related_name="connector")

これにより、ユーザー関係はオプションになりますが、これは必要なものではないと思います。代わりに、ユーザーにドロップダウンをまったく表示させるのではなくuser、フォームからフィールドを削除して手動で割り当ててみませんか。UserProfileその後、検証エラーは発生しません。

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ("user", )
于 2012-08-12T16:57:49.720 に答える
1

フォームからフィールドを除外するだけです。

class UserProfileForm(ModelForm):
  class Meta:
    model = UserProfile
    exclude = ('user',)
于 2012-08-12T16:57:36.510 に答える