2017-08-19 82 views
0

我試圖建立一個配置文件頁面,其中User可以填寫Teacher模型。Django CreateView/UpdateView與OnetoOne字段,取決於如果記錄存在

我的老師模型,model.py

class Teacher(models.Model): 
    user = models.OneToOneField(User, on_delete=models.PROTECT, related_name='Teacher') 
    rate = models.CharField(max_length=200) 
    availability = models.BooleanField(default=False) 

forms.py

class TeacherCreate(CreateView): 
    user_id = request.user.id #INCORRECT! Needs something to remember current user id. 
    model = Teacher 
    fields = ['rate','availability'] 

編輯:我也嘗試添加:

def form_valid(self, form): 
    form.instance.user = self.request.user 
    return super(TeacherCreate, self).form_valid(form) 

as suggested here.

我們不允許用戶在此創建視圖中更改其ID。實際上,我相信這應該是當前用戶ID user_id,它由request.user.id給出。

teacher_form.html

<form action="" method="post" enctype="multipart/form-data"> 
{% csrf_token %} 
    {% for field in form %} 
<div class="form-group"> 
    <span color="red">{{ field.errors }}</span> 
    <label> 
     {{ field.label_tag }} 
    </label> 
    <div>{{ field }}</div> 
</div> 
{% endfor %} 
    <button type="submit">Submit</button> 
    </form> 

現在的問題是,當我運行它,我得到的錯誤:

NOT NULL constraint failed: users_teacher.user_id

我相信這是因爲我沒有指定USER_ID 。

我怎麼想它的工作:

首先,檢查的老師已經在數據庫中的記錄。例如。如果Teacher表中有一行,並且user_id =當前用戶。

如果教師有個人資料 - >調用更新視圖。

如果教師沒有配置文件 - >使用創建視圖。

回答

0

嘗試添加LoginRequiredMixin你的看法,我的理解,簡單的創建或更新視圖:

from django.contrib.auth.mixins import LoginRequiredMixin 
from django.http import HttpResponseRedirect 
from django.views.generic import CreateView 


class TeacherCreate(LoginRequiredMixin, CreateView): 
    model = Teacher 
    fields = ['rate','availability'] 

    def get_success_url(self): 
     # replace url name 'users' on your if need 
     return reverse('users',args=(self.request.user.id,)) 

    def form_valid(self, form): 
     user = self.request.user 
     instance, _ = Teacher.objects.get_or_create(user=user) 
     instance.rate = form.cleaned_data.get("rate", "") 
     instance.availability = form.cleaned_data.get("availability", "") 
     instance.save() 
     # modify return 
     return HttpResponseRedirect(self.get_success_url()) 
+0

我得到的錯誤:UNIQUE約束失敗:users_teacher.user_id當我點擊保存按鈕 – Roma

+0

可能是您嘗試添加,存在'Teacher.user'的配置文件,如果是test db,請嘗試'Teacher.objects.all()。delete()' –

+0

我看到,這個嬰兒確實創建了一個新行。這導致我到最後一部分。如何在瀏覽器中擁有相同的頁面,更加智能,並決定是否需要執行更新視圖或創建視圖 – Roma

相關問題