2017-08-15 132 views
0

我正在尝试为我的所有用户创建一个配置文件模型。我有下面的代码中,我得到一个自定义字段birth_date,但似乎无法得到任何我的其他自定义字段的工作:在Django中扩展用户模型

forms.py:

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

class SignUpForm(UserCreationForm): 
    birth_date = forms.DateField(help_text='Required. Format: YYYY-MM-DD') 

    class Meta: 
     model = User 
     fields = ('username', 'first_name','last_name', 'birth_date','location', 'password1', 'password2',) 

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() 

views.py

from django.contrib.auth import login, authenticate 
from django.shortcuts import render, redirect 
from django.http import HttpResponse 
from .forms import SignUpForm 

def home(request): 
    return HttpResponse('fd') 


def signup(request): 
    if request.method == 'POST': 
     form = SignUpForm(request.POST) 
     if form.is_valid(): 
      user = form.save() 
      user.refresh_from_db() # load the profile instance created by the signal 
      user.profile.birth_date = form.cleaned_data.get('birth_date') 
      user.profile.college = form.cleaned_data.get('college') 
      user.save() 
      raw_password = form.cleaned_data.get('password1') 
      user = authenticate(username=user.username, password=raw_password) 
      login(request, user) 
      return redirect('home') 
    else: 
     form = SignUpForm() 
    return render(request, 'accounts/profile.html', {'form': form}) 

urls.py

urlpatterns = [ 

    url(r'^register/$', views.signup, name='profile'), 
    url(r'^home/$', views.home, name='home'), 

] 

如果我从forms.py删除location,形式会正确加载,并让我填写,并在提交的所有数据,包括自定义字段birth_date将节省。但是,当我尝试添加location的形式,我得到以下错误:

File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/forms/models.py", line 262, in __new__ 
    raise FieldError(message) 
django.core.exceptions.FieldError: Unknown field(s) (location) specified for User 

我不知道为什么我不能location字段添加到窗体。

回答

0

因为它不是用户上的字段。您需要像birth_date一样执行相同的操作 - 在窗体类中单独声明它,并将其明确保存到视图中的配置文件中。

+0

我一直在努力让这个工作好几天,谢谢! –