【问题标题】:Extending User Model Django, IntegrityError扩展用户模型 Django,IntegrityError
【发布时间】:2018-01-22 15:14:51
【问题描述】:

我正在尝试扩展 User 模型以创建 Profile 模型。下面的代码成功地显示了一个带有我指定为locationbio 的附加字段的表单。但是当我提交表单时,只有原始的usernamefirst_namelast_nameemailpassword 字段存储在http://127.0.0.1:8000/admin 的数据库中,我的自定义字段都没有存储在配置文件中我添加到 admin 的部分。我还收到以下错误:

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.

任何帮助将不胜感激。

【问题讨论】:

    标签: django django-models django-forms


    【解决方案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')
    

    【讨论】:

      【解决方案2】:

      您不能同时注册和配置 POST。因为您的配置文件模型是 1to1field 它属于 User,这意味着现有用户可以创建一个用户配置文件。所以最初用户应该创建他们的注册帐户而不是只有他们可以创建个人资料。

      【讨论】:

      • 您可以保存用户表单,然后将用户分配到配置文件验证配置文件表单,然后保存。
      • @wololoooo 这就是我要说的。首先,您必须保存用户,然后只有您可以为该用户创建配置文件
      猜你喜欢
      • 2016-10-12
      • 2011-02-28
      • 2013-12-06
      • 2018-01-21
      • 2018-04-24
      • 2017-03-02
      • 1970-01-01
      相关资源
      最近更新 更多