这是我的forms.py:
class RegistrationForm(forms.Form):
PET_CHOICES = (
('none','---'), ('dog', 'Dog'),
)
username = forms.CharField()
email = forms.EmailField()
password1 = forms.CharField()
birthdate = forms.DateField(widget=extras.SelectDateWidget)
pet = forms.ChoiceField(choices=PET_CHOICES)
这是我的models.py:
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class UserExtended(models.Model):
user = models.ForeignKey(User)
pet = models.CharField(max_length=40)
age = models.PositiveSmallIntegerField()
如您所见,此模型扩展了默认的Django User模型。现在,这是我注册用户的观点:
def registerView(request):
form = RegistrationForm()
if request.method == 'POST':
form = RegistrationForm(request.POST)
if form.is_valid():
user = User.objects.create_user(
username=form.cleaned_data['username'],
password=form.cleaned_data['password1'],
email=form.cleaned_data['email']
)
user.userextended_set.pet=form.cleaned_data['pet']
user.userextended_set.age=form.cleaned_data['birthdate']
return HttpResponseRedirect('/')
我想知道,这部分代码是否正确?
user.userextended_set.pet=form.cleaned_data['pet']
user.userextended_set.age=form.cleaned_data['birthdate']
上面两行,我试图添加到UserExtended模型,该模型具有ForiegnKey with User。我认为我做错了,因为在创建用户之后我使用函数
进行身份验证并记录用户authenticate()
和
login()
由django提供,如果我将它放在我的模板中,Django在登录后重定向到
<p>your pet is {{ user.userextended_set.pet }}</p>
它不会显示
的另一个{{ user.userextended_set.pet }}
。它只是说:
your pet is
。知道为什么它没有显示任何东西吗? {{user.userextended_set.pet}}
答案 0 :(得分:2)
userextended_set
实际上是管理员,而不是UserExtended
对象,因为ForeignKey
中有UserExtended
,表示User
可能有多个UserExtended
个对象。这可能不是你想要的 - 你可能想要使用OneToOneField
代替。
答案 1 :(得分:1)
这里的问题是,
user.userextended_set
会返回RelatedManager
类型。所以,你不能做一个简单的.pet
就行不通。
现在,看看你的模特,我假设你打算UserExtended
到OneToOneField
,而不是ForeignKey
。只要你能管理(非)创建重复项,你就可以了。
现在,回到你的问题:
你可以做到
user_extended = user.userextended_set.all()[0]
#Or if you are sure it is a unique relationship,
#user_extended = user.userextended_set.get()
#Note - this would raise error if MultipleObjectsReturned, or DoesNotExist
user_extended.pet = form.cleaned_data['pet']
user_extended.age = form.cleaned_data['age']
另外,在模板中,
{{ user.userextended_set.0.pet }}
甚至这个:
{% for u_e in user.userextended_set.all %}
{{u_e.pet}}
{% empty %}
Not found
{% endfor %}