0

내 의도는 Django의 User 모델과 UserProfile 모델 (기본적으로 사용자에 대한 세부 정보/필드를 추가 함)을 사용하여 사용자 프로파일을 만드는 것입니다. 그런 다음 사용자 모델과 UserProfile 모델 (즉, 두 모델 모두의 필드에 대한 단일 양식)에 포함 된 필드를 채우도록 요청하는 등록 양식을 작성하려고합니다.Django에서 UserProfile에 대한 백엔드/데이터베이스에 데이터를 저장하는 방법

지금 내 양식에 필요한 데이터를 입력하면 뷰가 전달되고 서버가 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) 

나는이

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

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

(정의 폼이 장고에 의해 정의 된 사용자 모델을 기반으로) 다음 forms.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) 

I가 다음 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> 

내가 뭘 잘못하고 있는지 누가 알 수 있습니까? 이 작업을 수행하는 더 좋은 방법이 있습니까? 미리 감사드립니다!

답변

0

내 마음에는 장고 신호를 사용할 필요가 없습니다.

당신은 (가능한 경우) 내가 당신의 문제가 해결됩니다 나에게 전체 프로젝트 소스를 제공하는 경우

한 형태로 두 개의 별도의 양식을 삽입에 대한 사용 방법은 권장되지 않으며 꽤하지 않습니다. 하지만 통과 된 데이터를 테스트 한 결과 올바른 코드라고 판단되면 다음 코드를 시도해보십시오.

사용자 및 userprofile 개체를 저장하는 방법이 변경되었습니다. 나를 통지. 모델에서

제거 신호 :

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) 
+0

POST 데이터에는 이러한 변수의 값이 들어 있습니다. 그게 당신이 요구하는 것입니까? – goelv

+0

또한 등록 페이지에서 유효성을 검사하기 위해 사용자를 선택하라는 메시지가 나타납니다 (form2). 그러나이 사용자는 양식을 통해 만들려는 사용자입니다 (즉, 작성된 연도가 아닙니다). 고유 한 외래 키를 선택적으로 설정할 수 있습니까? – goelv

+0

은 선택 사항이며 고유합니다. 이들은 역설적이다. 위의 코드를 사용해보고 알려주십시오. – Bartanix

0

당신이보기에 프로파일을 저장하는 바와 같이 당신은 post_save 신호가 필요하지 않습니다. 아마 그것은 덮어 씌워지고 있습니다.

1
당신이 prefix를 사용해야 하나 <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에서 사용자 필드를 제외
class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     exclude = ('user',) 

프로필을 수동으로 만드는 경우 po를 사용할 필요가 없습니다. st_save 신호