我是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 ------
答案 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