2017-08-14 118 views
0

我試圖擴展User模型以創建Profile模型。以下代碼成功顯示了一個表單,其中指定了locationbio的附加字段。但是,當我提交表格時,只有原始的username,first_name,last_name,emailpassword字段存儲在數據庫http://127.0.0.1:8000/admin,我的自定義字段都沒有存儲在我添加到管理員的配置文件部分。我也得到了以下錯誤:擴展用戶模型Django,IntegrityError

IntegrityError at /accounts/register/ 
NOT NULL constraint failed: accounts_profile.user_id 
Request Method: POST 
Request URL: http://127.0.0.1:8000/accounts/register/ 
Django Version: 1.11.2 
Exception Type: IntegrityError 
Exception Value:  
NOT NULL constraint failed: accounts_profile.user_id 
Exception Location: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py in execute, line 328 
Python Executable: /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 

models.py:

from django.db import models 
from django.contrib.auth.models import User 
from django.db.models.signals import post_save 
from django.dispatch import receiver 

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    bio = models.TextField(max_length=500, blank=True) 
    location = models.CharField(max_length=30, blank=True) 
    birth_date = models.DateField(null=True, blank=True) 

@receiver(post_save, sender=User) 
def create_user_profile(sender, instance, created, **kwargs): 
    if created: 
     Profile.objects.create(user=instance) 

@receiver(post_save, sender=User) 
def save_user_profile(sender, instance, **kwargs): 
    instance.profile.save() 

forms.py:

from django import forms 
from django.contrib.auth.models import User 
from django.contrib.auth.forms import UserCreationForm 
from .models import Profile 

class RegistrationForm(UserCreationForm): 
    email = forms.EmailField(required = True) 

    class Meta: 
     model = User #model User comes with username, email, first name, last name , pass1 and pass2 fields 
     fields = (
      'username', 
      'email', 
      'first_name', 
      'last_name', 
      'password1', 
      'password2' 
     ) 

    def save(self, commit = True): 
     user = super(RegistrationForm, self).save(commit = False) 
     user.first_name = self.cleaned_data['first_name'] 
     user.last_name = self.cleaned_data['last_name'] 
     user.email = self.cleaned_data['email'] 


     if commit: 
      user.save() 

      return user 

class ProfileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('location','bio') 

views.py:

from django.shortcuts import render, redirect 
from .forms import RegistrationForm,ProfileForm 



def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     profile_form = ProfileForm(request.POST) 
     if form.is_valid() and profile_form.is_valid(): 
      form.save() 
      profile_form.save() 
      return redirect('login') 

    else: 
     form = RegistrationForm() 
     profile_form = ProfileForm() 


    return render(request, 'accounts/register.html', {'form': form, 'profile_form': profile_form}) 

urls.py :

from django.conf.urls import url 
from django.contrib.auth.views import login 
from . import views 


urlpatterns = [ 
    # /accounts/ 
    url(r'^$', views.index, name = 'accounts'), 

    # /accounts/register/ 
    url(r'^register/$', views.register, name='register'), 

    url(r'^login/$', login, {'template_name': 'accounts/login.html'}, name='login'), 
] 

admin.py:

from django.contrib import admin 
from .models import Profile 
# Register your models here. 

admin.site.register(Profile) 
# Register your models here. 

任何幫助將不勝感激。

回答

0

你不能做註冊和輪廓POST在time.because您的個人資料模式是1to1場它屬於User這意味着現有的用戶可以創建一個用戶profile.So最初用戶應該不僅僅是他們可以創建自己的註冊賬號創建個人資料。

+0

您可以保存用戶表單然後分配給用戶個人資料驗證的個人資料表格,然後保存。 – wololoooo

+0

@wololoooo這就是我說的。首先,您必須保存用戶,然後只有您可以爲該用戶創建配置文件 – Akash

1

你必須設置的關係手動那麼你的觀點應該是這樣的:

if form.is_valid() and profile_form.is_valid(): 
     user_object = form.save() 
     a = profile_form.save(commit=False) 
     a.user = user_object 
     a.save() 
     return redirect('login')