Django - 在视图中访问关系数据库

时间:2014-02-17 01:40:07

标签: django django-models django-forms django-templates django-views

这是我的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}}

2 个答案:

答案 0 :(得分:2)

userextended_set实际上是管理员,而不是UserExtended对象,因为ForeignKey中有UserExtended,表示User可能有多个UserExtended个对象。这可能不是你想要的 - 你可能想要使用OneToOneField代替。

答案 1 :(得分:1)

这里的问题是,

user.userextended_set会返回RelatedManager类型。所以,你不能做一个简单的.pet就行不通。

现在,看看你的模特,我假设你打算UserExtendedOneToOneField,而不是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 %}