Django:尝试创建自定义表单时出现RelatedObjectDoesNotExist错误

3

大家好,我正在尝试创建一个自定义的注册表单。问题是当我尝试注册时,出现了"related object does not exist"的错误提示,我不知道为什么会出现这个问题。以下是我的views.py代码:

form = RegistrationForm()
if request.method=="POST":
    if request.POST['action']=="register":
        form = RegistrationForm(request.POST or None)
        if form.is_valid():
            form.save()

这是 forms.py 中的 RegistrationForm():

class RegistrationForm(UserCreationForm):

    fname = forms.CharField(max_length=256, label="", required=True, widget=forms.TextInput(attrs={'class': 'form-control','placeholder': 'First Name','required':True}))
    lname = forms.CharField(max_length=256, label="", required=True, widget=forms.TextInput(attrs={'class': 'form-control','placeholder': 'Last Name','required':True}))
    email = forms.EmailField(max_length=256, label="Email", required=True, widget=forms.EmailInput(attrs={'class': 'form-control','placeholder': 'Email','required':True, 'type':'email'}))
    emailConfirm = forms.EmailField(max_length=256, label="", required=True, widget=forms.EmailInput(attrs={'class': 'form-control','placeholder': 'Confirm Email','required':True, 'type':'email'}))
    password1 = forms.CharField(max_length=256, label="", required=True, widget=forms.PasswordInput(attrs={'class': 'form-control','placeholder': 'Password','required':True}))
    password2 =forms.CharField(required=False)

    biography = forms.CharField(label = "Biography",required=False)
    research_place = forms.CharField(label="Research Place",required=False)
    studies = forms.CharField(label="Studies",required=False)

    class Meta:
        model = RegisterUser
        fields = ('email','emailConfirm','password1','biography','research_place','studies')
    def save(self,commit=True):
        RegisterUser = super(RegistrationForm,self).save(commit=False)
        RegisterUser.first_name=self.cleaned_data['fname']
        RegisterUser.last_name=self.cleaned_data['lname']
        RegisterUser.biography=self.cleaned_data['biography']
        RegisterUser.research_place="Def"
        RegisterUser.studies="Def"
        print (RegisterUser.studies)

        if commit:
            print("hurr")
            RegisterUser.save()
        return RegisterUser

我的 models.py 文件如下:

class RegisterUser(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)
    biography = models.CharField(max_length=1000000)
    research_place = models.CharField(max_length=1000000)
    studies = models.CharField(max_length=1000000)


    def set_password(self, raw_password):
        self.user.set_password(raw_password)
    USERNAME_FIELD='email'
    REQUIRED_FIELDS = ['fname', 'lname','password1']
    is_active=False

最后是admin.py文件:
class RegisterInline(admin.StackedInline):
    model = RegisterUser
    can_delete = False

class UserAdmin(BaseUserAdmin):
    inlines = (RegisterInline, )

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

请告诉我我做错了什么,以及我是否需要更改其他内容。非常感谢!

完整跟踪: 跟踪回溯:

File "/Users/swedishfished/Desktop/tryDjango/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/swedishfished/Desktop/tryDjango/src/SignUp/views.py" in lOut
  122.                      form.save()
File "/Users/swedishfished/Desktop/tryDjango/src/SignUp/forms.py" in save
  48.       RegisterUser = super(RegistrationForm,self).save(commit=False)
File "/Users/swedishfished/Desktop/tryDjango/lib/python3.4/site-packages/django/contrib/auth/forms.py" in save
  93.         user.set_password(self.cleaned_data["password1"])
File "/Users/swedishfished/Desktop/tryDjango/src/SignUp/models.py" in set_password
  38.       self.user.set_password(raw_password)
File "/Users/swedishfished/Desktop/tryDjango/lib/python3.4/site-packages/django/db/models/fields/related.py" in __get__
  608.                 "%s has no %s." % (self.field.model.__name__, self.field.name)

终端报错: "POST /out HTTP/1.1" 500 82901

异常位置: /Users/swedishfished/Desktop/tryDjango/lib/python3.4/site-packages/django/db/models/fields/related.py 中的 get,第608行


请在您的问题中添加完整的堆栈跟踪。 - Arctelix
@arctelix 我已经添加了它。 - swedishfished
@arctelix,然后它说“RegisterUser”没有“set_password”属性。 - swedishfished
好的,差不多了...将您的set_password方法添加回去,并修改RegistrationForm中的行RegisterUser = super(RegistrationForm,self).save(),我们去掉了commit=false - Arctelix
1
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Arctelix
显示剩余3条评论
1个回答

2

Django会自动从UserCreationForm添加所有的用户字段。因此,您只需要添加您自己的自定义内容。最重要的问题在于您的Meta.model和save方法。

替换RegistrationForm:

class RegistrationForm(UserCreationForm):
    biography = forms.CharField(label = "Biography",required=False)
    research_place = forms.CharField(label="Research Place",required=False)
    studies = forms.CharField(label="Studies",required=False)

    class Meta:
        # This tells Django to perform all the user actions and the standard
        # user model.  It does not care about RegisterUser.
        model = User
        fields =('email','emailConfirm','password1','biography','research_place','studies')

    def save(self,commit=True):
        # you were redefining RegisterUser before
        # First we need to save the user model,  we use a variable to work  
        # with the user instance.
        user = super(RegistrationForm,self).save(commit=False)
        user.username = user.email
        user.save()

        # Now we can save your custom RegisterUser
        r_user = RegisterUser(user=user,
                      biography=self.cleaned_data['biography'], 
                      research_place=self.cleaned_data['research_place'], 
                      studies=self.cleaned_data['studies'])
        if commit:
            r_user.save()
            print ('saving user: %s' % self.user)

        # We return the new RegisterUser instance which contains the user
        return r_user

清理模型:

class RegisterUser(models.Model):
    user=models.OneToOneField(User,on_delete=models.CASCADE)
    biography = models.CharField(max_length=1000000)
    research_place = models.CharField(max_length=1000000)
    studies = models.CharField(max_length=1000000)

    # None of the stuff you had below is required

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接