在Django中访问自定义UserCreationForm的其他字段

时间:2018-02-11 22:58:37

标签: python django

我是Django的新手,在运行官方教程和阅读其他文章后开始我的第一个应用程序。

我在访问我为User模型添加的附加字段时遇到问题。我无法弄清楚问题,任何帮助/指针将不胜感激。

Forms.py (我在下面显示的示例代码中添加了字段country

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

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Submit

class RegisterUserForm(UserCreationForm):
    country = forms.CharField()

    def __init__(self, *args, **kwargs):
            super(RegisterUserForm, self).__init__(*args, **kwargs)
            self.helper = FormHelper()
            self.helper.form_id = 'id-exampleForm'
            self.helper.form_class = 'blueForms'
            self.helper.form_method = 'post'
            self.helper.form_action = '.'
            self.helper.add_input(Submit('submit', 'Submit'))

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

    def save(self, commit=True):
        user = super(RegisterUserForm,self).save(commit=False)
        user.country = self.cleaned_data["country"]
        print user.country
        if commit:
            print "saving user"
            user.save()
        return user

Views.py

from django.shortcuts import render
from django.views.generic import CreateView
from .forms import RegisterUserForm

class RegisterUserView(CreateView):
    form_class = RegisterUserForm
    template_name = 'accounts/register.html'
    success_url = '/'

Admin.py

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from .forms import RegisterUserForm

class NewUserAdmin(UserAdmin):
    add_form = RegisterUserForm

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

问题:

admin应用中,我没有看到额外的字段。我甚至尝试使用user访问shell模型但无法获取它。我无法理解我的代码有什么问题。我尝试在覆盖保存方法中使用print语句,我可以看到它正在执行。

>>> from django.contrib.auth.models import User
>>> User.objects.all().last().country
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'User' object has no attribute 'country'

我尝试进一步调试,看起来save没有保存属性,这是我使用的方法

def save(self, commit=True):
        user = super(RegisterUserForm,self).save(commit=False)
        user.country = self.cleaned_data["country"]
        print user.country
        if commit:
            print "saving user"
            user.save()
            print user.country
            print type(user)

            q = User.objects.all().last()
            print q.country. ------ ERROR ------

1 个答案:

答案 0 :(得分:1)

这是混合表单和模型的情况。向表单添加字段时,该字段也不会自动转换为模型上的字段。反之亦然<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>Model s。也就是说,如果向模型中添加一个字段,它可以在没有任何实际工作的情况下显示在ModelForm中。

ModelForm

所以你在这里做的是在表单中添加一个字段。

您需要做的是将其添加到您的用户模型中。但首先,您需要决定采用哪种方法extends the user model

一个建议:

country = forms.CharField()

然后您需要from django.contrib.auth.models import AbstractUser class MyUser(AbstractUser): country = models.CharField() makemigrations