簡體   English   中英

當存在外鍵時,Django中的UserCreationForm具有額外的字段

[英]UserCreationForm in Django with extra fields when a foreign key exists

我是Django的新手,正在嘗試創建注冊表格。 這是我模型的相關部分:

class UserProfile(models.Model):
    user = models.OneToOneField(User)

    university = models.ForeignKey('University')
    course_title = models.ForeignKey('Course_Title')

    class Meta:
        db_table = 'user_profile'

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

post_save.connect(create_user_profile, sender=User)

這是我正在使用的表格:

from django.contrib.auth.forms import UserCreationForm
from django import forms
from django.contrib.auth.models import User
from shelf.models import University, Course_Title, UserProfile

class RegistrationForm(UserCreationForm):

error_messages = {
    'duplicate_email': "A user with that e-mail already exists.",
    'email_mismatch': "The two e-mail fields didn't match.",
}

# An e-mail is being used instead of the usual Django username.
username = forms.EmailField(label="E-mail")
username2 = forms.EmailField(label="Confirm E-mail")
university = forms.ModelChoiceField(queryset=University.objects.all(), empty_label="Please choose a university")
course_title = forms.ModelChoiceField(queryset=Course_Title.objects.all(), empty_label="Please choose a course title")

class Meta:
    model = User
    fields = ("first_name", "last_name", "university", "course_title", "username", "username2")

    .
    .
    .

def save(self, commit=True):
    user = super(RegistrationForm, self).save(commit=False)
    user.save()
    user_profile = UserProfile(user=user, university=self.cleaned_data["university"], course_title=self.cleaned_data["course_title"])
    if commit:
        user_profile.save()
    return user_profile

而且,這是我的觀點

def index(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm() 

    return render(request, "shelf/register.html",  {'form': form,  })

我收到錯誤user_profile.university_id可能不為NULL。 我已經為發生這種情況的原因進行了很多調查,並且了解發生這種情況的原因。 但是我似乎無法修復它。

提前致謝。

看來問題是由您的信號處理程序引起的:

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

post_save.connect(create_user_profile, sender=User)

請嘗試禁用此處理程序,然后再次測試。

如果需要信號處理程序,請嘗試更改form.save方法:

def save(self, commit=True):
    user = super(RegistrationForm, self).save(commit=False) #this should trigger the signal handler to create a UserProfile instance, but not commit
    user_profile = user.get_profile()
    user_profile.university=self.cleaned_data["university"]
    user_profile.course_title=self.cleaned_data["course_title"]
    if commit:
        user.save()
        user_profile.save()

請注意,如果在外殼中創建用戶,仍然會遇到相同的錯誤,我認為您可以為UserProfile模型中的university和course_title字段添加默認值:

class UserProfile(models.Model):
    user = models.OneToOneField(User)

    university = models.ForeignKey('University', default=1)
    course_title = models.ForeignKey('Course_Title', default=1)

我有同樣的問題,但是我按照以下步驟解決了

模型

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

class UserProfile(models.Model):
    url = models.URLField()
    home_address = models.TextField()
    user = models.ForeignKey(User, unique=True)


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

post_save.connect(create_user_profile, sender=User)

視圖

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User, Group
from django import forms
from django.shortcuts import render_to_response
from django.http import HttpResponse
from django.template.context import RequestContext
from django.views.decorators.csrf import csrf_protect
class RegisterForm(UserCreationForm):
    permission_choices = (
            ('1', 'test1'),
            ('2', 'test2'),
            )
    email      = forms.EmailField(required=False)
    first_name = forms.CharField(required=False)
    last_name  = forms.CharField(required=False)
    url        = forms.URLField()
    permission = forms.ChoiceField(choices=permission_choices)

    class Meta(UserCreationForm.Meta):
        model = User
        fields = ('first_name', 'last_name', 'url', 'username', 'email', 'password1', 'password2', 'permission')

    def save(self, commit=True):
        user = super(RegisterForm, self).save(commit=False)
        user_profile    = user.get_profile()
        user.email      = self.cleaned_data['email']
        user.first_name = self.cleaned_data['first_name']
        user.last_name  = self.cleaned_data['last_name']
        user.permission = self.cleaned_data['permission']
        user_profile.url = self.cleaned_data['url']
        if commit:
            user.save()
            user_profile.save()
        return user

@csrf_protect
def register(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            if new_user.permission == 'q':
                try:
                    new_user.groups.add(Group.objects.get(name='test1'))
                except Group.DoesNotExist:
                    u = User.objects.get(pk=new_user.pk)
                    u.delete()
                    return HttpResponse('The Organisation you\'ve just choosed doesn\' exist')
            return HttpResponse('OK')
    else:
        form = RegisterForm()

    return render_to_response('registration/user.html', {'form': form}, context_instance=RequestContext(request))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM