2012-08-12 30 views
2

我有一個用戶模型(由Django預先定義)和一個UserProfile模型通過一個ForeignKey連接。如何在Django中使unique = true的外鍵成爲「可選」?

我創建了兩個單獨的模板框架用於單個模板作爲排序註冊表單。

models.py

class UserProfile(models.Model): 
    # This field is required. 
    user = models.ForeignKey(User, unique=True, related_name="connector") 
    location = models.CharField(max_length=20, blank=True, null=True) 

forms.py

class UserForm(ModelForm): 
    class Meta: 
     model = User 

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 

然而,當我加載網頁表單填寫信息時,UserProfileForm要求我選擇/填寫用戶字段爲了驗證。

然而,這個「用戶」是現在正在創建的用戶,所以我不能選擇一個「用戶」,因爲它尚未創建/仍在創建。

我知道這個用戶是字段有unique = true屬性,但有一種方法可以使此字段爲「可選」嗎?我的視圖(下面)應該處理它,使得一旦創建了用戶對象,我將把UserProfile的外鍵設置爲這個新創建的用戶對象(除非我做錯了我的views.py)。

views.py

@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     form1 = UserForm(request.POST) 
     form2 = UserProfileForm(request.POST) 
     if form1.is_valid() and form2.is_valid(): 
      #create initial entry for user 
      username = form1.cleaned_data["username"] 
      password = form1.cleaned_data["password"] 
      new_user = User.objects.create_user(username, password) 
      new_user.save() 

      #create entry for UserProfile (extension of new_user object)  
      profile = form2.save(commit = False) 
      profile.user = new_user 
      profile.save() 
      return HttpResponseRedirect("/books/") 
    else: 
     form1 = UserForm() 
     form2 = UserProfileForm() 
    c = { 
     'form1':form1, 
     'form2':form2, 
    } 
    c.update(csrf(request)) 
    return render_to_response("registration/register.html", c) 

回答

1

那麼你可以設置:

user = models.ForeignKey(User, unique=True, blank=True, null=True, related_name="connector") 

這將使用戶關係可選的,但我不認爲這是你所需要的。相反,爲什麼不從UserProfile表格中刪除user字段並手動分配它,而不是讓用戶看到下拉菜單。那麼就不會有驗證錯誤。

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     exclude = ("user",) 
1

只需從表格中排除的領域。

class UserProfileForm(ModelForm): 
    class Meta: 
    model = UserProfile 
    exclude = ('user',)