2016-03-21 38 views
0

使用ModelForm時,我陷入了僵局。ModelForm和相關對象問題

我是用Django自帶的extending the User model,我也使用ModelForm,因此用戶可以編輯它。

按照文檔中的相同示例,我將擁有此代碼。

models.py

class Employee(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    # In this case, department is optional, so I have set 'blank' and 'null' to True. 
    department = models.CharField(max_length=100, blank=True, null=True) 

forms.py

class DepartmentForm(ModelForm): 
    class Meta: 
     model = Employee 
     fields = ['department',] 

這個問題是在視圖。我發現我需要將模型的一個實例傳遞給窗體,所以save()函數不需要定製它,但是當然,user.employee還沒有創建,因此會引發錯誤。

views.py

def DepartmentView(request): 
    # Here is the issue. 
    department = request.user.employee 
    if request.method == 'POST': 
     # I need to pass the instance here. 
     form = DepartmentForm(request.POST, instance=department) 
     if form.is_valid(): 
      form.save() 
    else: 
     # And also here so it autocompletes the form. 
     form = DepartmentForm(instance=department) 
    return render(request, 'employee.html', {'form': form}) 

它的工作原理,如果我手動添加值通過shell來user.employee.department,然後重新載入頁面,否則錯誤是如下。

RelatedObjectDoesNotExist at [something] 
User has no employee. 

或者類似的東西...我很抱歉,我沒有嘗試上面的代碼,這樣的錯誤可能是有點不同,但概念是完全一樣的。

我也很抱歉,如果這之前已經問過。我做了一次Google搜索,找不到這個問題的答案。

+0

請注意,對於CharField,通常不需要具有'null = True'。如果你只有'blank = True',那麼該字段是可選的,並且當沒有給出該值時將保存空字符串''''。 – Alasdair

回答

0

您可以使用get_or_create從db中獲取員工,或者在不存在的情況下創建員工。

department, created = Employee.objects.get_or_create(user=request_or_user, department='') 
if request.method == 'POST': 
    form = DepartmentForm(request.POST, instance=department) 
    ... 

另一種選擇是使用信號,以便在創建用戶時創建相關模型。然後您可以假定員工已經存在,並且您可以使用request.user.employee而不是get_or_create

+0

謝謝,'get_or_create'似乎是我最好的選擇。之所以我在模型中包含'null = True'是因爲沒有它,當字段爲空時,即使使用'get_or_create',我也會收到很多'IntegrityError'錯誤。 –

+0

我很驚訝你會得到完整性錯誤,除非你已經爲該領域設置了「unique = True」。創建實例時,您可以嘗試設置'department ='''。 – Alasdair

+0

我不會太在意,使用'null = True'和'get_or_create'時它工作得很好。 –