0

訪問關係數據庫這是我forms.py:Django的 - 鑑於

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用戶模型。現在,這是我對哪個註冊用戶的看法:

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'] 

上面的兩行代碼,我試圖添加到用戶的ForiegnKey UserExtended模型。我想我做錯了什麼,因爲創建和用戶後,我驗證和登錄用戶在使用Django提供的功能

authenticate() 

login() 

,如果我把這個在我模板,Django的重定向到

<p>your pet is {{ user.userextended_set.pet }}</p> 

登錄後不顯示其他的

{{ user.userextended_set.pet }} 

。它只是說:

your pet is 

。任何想法爲什麼它不顯示任何東西? {{user.userextended_set.pet}}

回答

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 %} 
+0

另外,你究竟是什麼意思?「只要你能管理(非)重複的創建,你就好了。」? – user2719875

+1

我的意思是你應該確保你的應用程序不允許爲給定的用戶多次創建'UserExtended'對象。 – karthikr

2

userextended_set實際上是經理,而不是UserExtended對象,因爲您在UserExtended中有ForeignKey,這表示User可能有多個UserExtended對象。這可能不是你想要的 - 你可能想用OneToOneField來代替。

+0

當我將其更改爲OneToOneField,然後創建一個新用戶時,它給我一個錯誤,指出「AttributeError at/register /」(它調用registerView)。錯誤說「'用戶'對象沒有'userextended_set'」屬性。回溯指的是在registerView中的行,它寫着「user.userextended_set.pet = form.cleaned_data ['pet']」..任何想法爲什麼這樣做? – user2719875

+1

對,在'OneToOneField'中,您會將該字段引用爲'user.userextended'。 – mipadi