0

私の意図は、Django の User モデルと UserProfile モデル (基本的にユーザーに関する詳細/フィールドを追加する) を使用してユーザー プロファイルを作成することです。次に、User Model と UserProfile Model の両方に含まれるフィールドに入力するよう求める登録フォーム (つまり、両方のモデルのフィールド用の単一フォーム) を作成したいと考えています。

現在起こっていることは、必要なデータをフォームに入力した後、ビューが通過し、サーバーが User オブジェクトを作成し、それを UserProfile オブジェクトにリンクすることです (私が理解している限り、このリンクは、で作成されたシグナルのために発生します) models.py クラス)。ただし、UserProfile (この場合は「場所」フィールド) に関する情報は追加されず、私の人生では理由がわかりません。

私は次の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)

def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.create(user=instance)

post_save.connect(create_user_profile, sender=User)

私は次のforms.pyを持っています(UserFormはDjangoによって定義されたユーザーモデルに基づいています)

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

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

私は次のviews.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)

私は次のregister.htmlを持っています

<form action="/accounts/register/" method="post">{% csrf_token %}
   <p style="color:red"> {{form.username.errors}}</p>
    {{ form1.as_p }}
    {{ form2.as_p }}
    <input type="submit" value="Create the account">
</form>

誰かが私が間違っていることを見ることができますか? これを行うより良い方法はありますか?前もって感謝します!

4

3 に答える 3

1

問題は、1つに複数のフォームがあるため、プレフィックス<form></form> を使用する必要があるため、コードは次のようになります。

@csrf_protect
def register(request):
    if request.method == 'POST':
        form1 = UserForm(request.POST, prefix = "user")
        form2 = UserProfileForm(request.POST, prefix = "profile")
        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(prefix = "user")
        form2 = UserProfileForm(prefix = "profile")
    c = {
        'form1':form1,
        'form2':form2,
        }
    c.update(csrf(request))
    return render_to_response("registration/register.html", c)

UserProfileFormからユーザーフィールドを除外するには、excludeを使用します

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        exclude = ('user',)

また、プロファイルを手動で作成する場合は、post_saveシグナルを使用する必要はありません。

于 2012-08-13T10:01:38.797 に答える
0

post_saveビューでプロファイルを保存しているため、信号は必要ありません。おそらく、上書きされています。

于 2012-08-12T11:51:55.263 に答える
0

私の考えでは、django シグナルを使用する必要はありません。

プロジェクトの完全なソースを教えていただければ (可能であれば) 問題を解決します

2 つの別々のフォームを 1 つのフォームに埋め込むために使用した方法は推奨されておらず、見栄えもよくありません。ただし、渡されたデータをテストして正しいと言う場合は、まず次のコードを試してください。

ユーザーおよびユーザー プロファイル オブジェクトの保存方法を変更しました。私に通知する。

モデルから信号を削除:

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

ビューの場合:

@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()
               new_user.username = username
               new_user.set_password(password)
               new_user.save()

               profile = UserProfile()
               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)
于 2012-08-12T07:53:03.090 に答える